我认为 PEP 的描述__instancecheck__()
是错误的。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>
结论:PEP 3119 需要与“数据模型”文档一起重写。