可能是一个n00b问题,但我目前有一个实现迭代器的类,所以我可以做类似的事情
for i in class():
Run Code Online (Sandbox Code Playgroud)
但我希望能够通过索引来访问类
class()[1]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
谢谢!
我试图了解使用抽象基类的好处.考虑这两段代码:
抽象基类:
from abc import ABCMeta, abstractmethod, abstractproperty
class CanFly:
__metaclass__ = ABCMeta
@abstractmethod
def fly(self):
pass
@abstractproperty
def speed(self):
pass
class Bird(CanFly):
def __init__(self):
self.name = 'flappy'
@property
def speed(self):
return 1
def fly(self):
print('fly')
b = Bird()
print(isinstance(b, CanFly)) # True
print(issubclass(Bird, CanFly)) # True
Run Code Online (Sandbox Code Playgroud)
简单继承:
class CanFly(object):
def fly(self):
raise NotImplementedError
@property
def speed(self):
raise NotImplementedError()
class Bird(CanFly):
@property
def speed(self):
return 1
def fly(self):
print('fly')
b = Bird()
print(isinstance(b, CanFly)) # True
print(issubclass(Bird, CanFly)) …
Run Code Online (Sandbox Code Playgroud) 我读了两篇关于python中元类的文章:
Python 中的元类是什么? http://jakevdp.github.io/blog/2012/12/01/a-primer-on-python-metaclasses/
我阅读了有关 ABC(抽象基类)的信息,该信息显示在:
https://docs.python.org/2/library/abc.html。
所以我不得不问:元类和抽象基类(ABC)有什么区别?
据我所知,我可以使用两者来定义元类(元类)的类创建。
我会出于什么目的使用 ABC 或“我自己的”元类?
抽象基类在Python中仍然可以派上用场.在编写一个抽象基类,我希望每个子类都有一个spam()
方法,我想写这样的东西:
class Abstract(object):
def spam(self):
raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)
挑战还包括想要使用super()
,并通过将其包含在整个子类链中来正确地完成.在这种情况下,似乎我必须super
包括如下所示的每个调用:
class Useful(Abstract):
def spam(self):
try:
super(Useful, self).spam()
except NotImplementedError, e:
pass
print("It's okay.")
Run Code Online (Sandbox Code Playgroud)
这对于一个简单的子类来说没问题,但是当编写一个有很多方法的类时,try-except会变得有点麻烦,而且有点难看.是否有更优雅的抽象基类子类化方法?我只是做错吗?
我想扩展类"list"的功能并为事件添加自定义处理程序:"将新项目添加到列表"和"从列表中删除项目".对于这个任务,我不想使用组合,更好的是继承.
我尝试做了什么:
class ExtendedList(list):
def append(self, obj):
super(ExtendedList, self).append(obj)
print('Added new item')
def extend(self, collection):
if (hasattr(collection, '__iter__') or hasattr(collection, '__getitem__')) and len(collection)>0:
for item in collection:
self.append(item)
def insert(self, index, obj):
super(ExtendedList, self).insert(index, obj)
print('Added new item')
def remove(self, value):
super(ExtendedList, self).remove(value)
print('Item removed')
Run Code Online (Sandbox Code Playgroud)
但它无法正常工作.我无法捕捉所有添加和删除事件.例如:
collection = ExtendedList()
collection.append('First item')
# Out: "Added new item\n"; collection now is: ['First item']
collection.extend(['Second item', 'Third item'])
# Out: "Added new item\nAdded new item\n"; collection now is: ['First item', 'Second item', 'Third …
Run Code Online (Sandbox Code Playgroud) 我正在尝试下面的python代码:
from abc import ABCMeta, abstractmethod
class Bar:
__metaclass__ = ABCMeta
@abstractmethod
def foo(self):
pass
class Bar2(Bar):
def foo2(self):
print("Foo2")
b = Bar()
b2 = Bar2()
Run Code Online (Sandbox Code Playgroud)
我认为@abstractmethod
确保我的父类是抽象的,子类也是抽象的,因为它没有实现抽象方法.但是在这里,我没有尝试实例化这两个类的错误.
有谁能解释为什么?
我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:
请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化
所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。
例如,isinstance([], abc.Iterable)
, 返回True
列表,也是如此abc.Sequence
,abc.MutableSequence
这是有道理的。对于isinstance
和issubclass
方法,以下内容也是如此。
issubclass(str, abc.MutableSequence) --> False
isinstance((), abc.MutableSequence) --> False
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作:
class A:
def __iter__(self):
pass
a = A()
isinstance(a, abc.Iterable) # True
issubclass(A, abc.Iterable) # True
Run Code Online (Sandbox Code Playgroud)
但是 Aabc.Iterable
在它的类定义中没有子类化(并且,我假设前面提到的其他类也没有,根据这本书)。这些issubclass / isinstance
方法和 ABC 接口在这里是如何工作的?这些函数是否只是在类定义中查找 dunder 方法签名并将它们与上述 ABC 类中的 dunder 签名匹配?
除了提供一种验证类是否包含某些特定的 dunder 方法之外,我看不到 ABC 类的任何目的,因此了解更多有关整个过程的目的会很好。
任何形式的帮助将不胜感激。谢谢。
python ×7
abc ×2
inheritance ×2
list ×2
python-3.x ×2
abstract ×1
iterator ×1
metaclass ×1
super ×1