2

为什么这会打印一个 False?

#! /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
4

2 回答 2

5

根据文档__instancecheck__应该返回 True 或 False。

但是,A.__instancecheck__在您的代码中确实返回 Nothing;没有隐式返回;None被视为 False;所以False打印出来了。

于 2013-09-03T15:16:29.530 回答
2

魔法__instancecheck__应该在元类上定义而不是在类本身上。请参阅文档

请注意,这些方法是根据类的类型(元类)查找的。它们不能被定义为实际类中的类方法。

您看到的奇怪行为是错误放置了isinstance论点。你写了:

isinstance(a, a)

但实际上应该是:

isinstance(a, A)

现在,这是错误的喜剧:如果您错误地将其定义__instancecheck__为普通类的方法,则该类的实例可能会意外地用作的第二个参数isinstance(通常第二个参数将是类对象)。Python 并不真正关心第二个参数的类型是类还是元类,因为这只是鸭子类型的作用。

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

于 2019-06-19T00:42:19.113 回答