Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中自定义_instancecheck__Python - Fatal编程技术网

在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,…)
@abc
isinstance
\uuu instancecheck\uuuuuu
的结果强制为bool。您的回答并非完全错误,但也不是问题的核心。正确用法是
isinstance(a,a)
,在元类上定义了钩子。这个答案相当混乱!值得注意的是,对于正确的用法,
isinstance(a,a)
不会调用
\uuu instancecheck\uuuu
,因为它是精确的类型匹配,因此会使用快捷方式(请参阅)。