为什么打印错误?
#! /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
答案 0 :(得分:6)
根据the documentation,__instancecheck__
应该返回True或False。
但是,代码中的A.__instancecheck__
确实返回Nothing;没有隐含地返回; None
被视为错误;所以打印False
。
答案 1 :(得分:0)
__instancecheck__
魔术应该在元类上定义,而不是在类本身上定义。参见docs:
请注意,这些方法是在类的类型(元类)上查找的。不能将它们定义为实际类中的类方法。
您看到的奇怪行为是由于滥用isinstance
函数。您写道:
isinstance(a, a)
但实际上应该是:
isinstance(a, A)
现在,这是错误的喜剧:如果您将__instancecheck__
定义为普通类的方法,则该类的实例可以用作{{1}的 second 参数}。那只是行动中的鸭式打字。
请注意,isinstance
将isinstance
的返回值强制为布尔值。直接使用__instancecheck__
调用将返回a.__instancecheck__(a)
。