在python中自定义_instancecheck_
为什么这个印刷品是假的在python中自定义_instancecheck_,python,Python,为什么这个印刷品是假的 #! /usr/bin/env python class A(object): def __instancecheck__(self,arg): print self, type(self), arg , type(arg) if __name__ == '__main__': a = A() print isinstance(a,a) 给出: $ ./isinstancecheck.py <__main__.A ob
#! /usr/bin/env python
class A(object):
def __instancecheck__(self,arg):
print self, type(self), arg , type(arg)
if __name__ == '__main__':
a = A()
print isinstance(a,a)
给出:
$ ./isinstancecheck.py
<__main__.A object at 0x7f0574198b90> <class '__main__.A'> <__main__.A object at 0x7f0574198b90> <class '__main__.A'>
False
$。/isinstancecheck.py
假的
根据,实例检查应返回True或False
但是,A.\uu实例检查\uuu
在您的代码中不返回任何内容;无隐式返回<代码>无
被视为假;因此,将打印False
。应该在元类而不是类本身上定义\u实例检查\u
魔术。见:
注意,这些方法是在类的类型(元类)上查找的。它们不能定义为实际类中的类方法
您看到的奇怪行为是将isinstance
参数放错了位置。你写道:
isinstance(a, a)
但实际上应该是:
isinstance(a, A)
现在,这里是错误的喜剧:如果您错误地将\uu instancecheck\uu
定义为普通类上的方法,则该类的实例可能会意外地用作isinstance
的第二个参数(通常第二个参数是类对象)。Python并不真正关心第二个参数的类型是类还是元类,因为这只是实际的duck类型
请注意,
isinstance
强制将\uu instancecheck\uu
的返回值设置为布尔值。使用a直接调用。uu实例检查\uuu(a)
将返回None
print None
打印“None”。我不认为这里发生的事情是这样的。@abc,你不是直接调用\uu instancecheck\uu
。(它在内部由isinstance
调用)。在\uuuu instancecheck\uuuu
的末尾添加return True
,然后尝试print isinstance(a,…)
@abcisinstance
将\uuu instancecheck\uuuuuu
的结果强制为bool。您的回答并非完全错误,但也不是问题的核心。正确用法是isinstance(a,a)
,在元类上定义了钩子。这个答案相当混乱!值得注意的是,对于正确的用法,isinstance(a,a)
不会调用\uuu instancecheck\uuuu
,因为它是精确的类型匹配,因此会使用快捷方式(请参阅)。