我認爲描述__instancecheck__()
的PEP故障。 PEP 3119說:
這裏提出的主要機制是允許超載 內置函數isinstance()和issubclass()。超載 的工作原理如下:調用isinstance(x,C)首先檢查是否存在 C.__instancecheck__
,如果存在,則調用C.__instancecheck__(x)
而不是其正常實現。
你可以寫:
class C:
def do_stuff(self):
print('hello')
C.do_stuff(C())
因此,基於從PEP上面的報價,你應該能夠編寫
class C:
@classmethod
def __instancecheck__(cls, x):
print('hello')
C.__instancecheck__(C())
--output:--
hello
但isinstance()不調用該方法:
class C:
@classmethod
def __instancecheck__(cls, y):
print('hello')
x = C()
isinstance(x, C)
--output:--
<nothing>
然後PEP繼續說:
這些方法旨在叫上一個其元類 是(來源於)ABCMeta ...
好吧,讓我們試試:
import abc
class MyMeta(abc.ABCMeta): #A metaclass derived from ABCMeta
def __instancecheck__(cls, inst):
print('hello')
return True
class C(metaclass=MyMeta): #A class whose metaclass is derived from ABCMeta
pass
x = C()
C.__instancecheck__(x)
--output:--
hello
但再次isinstance()不會調用該方法:
isinstance(x, C)
--output:--
<nothing>
結論:PE需要重寫P 3119以及「數據模型」文檔。
這是有關(但不是重複):http://stackoverflow.com/questions/13135712/class-method-instancecheck-does-not-work – dnozay