在python中自定义__instancecheck__

时间:2013-09-03 15:13:35

标签: 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 object at 0x7f0574198b90> <class '__main__.A'> <__main__.A object at     0x7f0574198b90> <class '__main__.A'>
False

2 个答案:

答案 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 参数}。那只是行动中的鸭式打字。

请注意,isinstanceisinstance的返回值强制为布尔值。直接使用__instancecheck__调用将返回a.__instancecheck__(a)