這更多的是Python 2的問題,但我很好奇Python 3是否有任何不同。我注意到,當在類上創建某些方法時(無論它們是否是新風格),Python自動決定這些類是來自collections模塊的某些類的實例。我下面的例子用collections.Callable演示了這個。自動繼承自collections.Callable(和其他類)是如何工作的?
>>> import collections
>>> class A:
def __call__(self):
print "A"
>>> a = A()
>>> isinstance(a, collections.Callable)
True
>>> class A(object):
def __call__(self):
print "A"
>>> a = A()
>>> isinstance(a, collections.Callable)
True
>>> class A(object):
pass
>>> a = A()
>>> isinstance(a, collections.Callable)
False
>>> class A:
pass
>>> a = A()
>>> isinstance(a, collections.Callable)
False
你會發現,我沒有明確做出的任何這些類的從collections.Callable繼承,但由於某些原因,他們都只要他們創造一個__call__
方法做。 這是爲了一個特定的目的而完成的,並且它在某個地方被很好地定義了嗎? Python是否自動爲特定的基類提供類來定義方法或者是其他的事情?
對於collections.Iterable和__iter__
方法以及一些其他特殊方法,您也會得到類似的結果。
請參閱https://docs.python.org/2/library/abc.html,特別是[本節](https://docs.python.org/2/library/abc.html#abc.ABCMeta .__ subclasshook__)和[this](https://docs.python.org/2/library/collections.html#collections-abstract-base-classes)。 – BrenBarn