Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/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 猴打鸭_Python_Isinstance - Fatal编程技术网

Python 猴打鸭

Python 猴打鸭,python,isinstance,Python,Isinstance,我用uu iter uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。从中,Iterable仅根据类是否已实现iter来确定 那么,为什么这个猴子补丁不能像我预期的那样工作呢?您将变量\uuuuu iter\uuuuuuuuu添加到a。必须将其添加为如下方法: 更新:此答案意外返回True。这只是返回True,因为我设置了iter,然后调用isinstan

我用uu iter uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。从中,Iterable仅根据类是否已实现iter来确定

那么,为什么这个猴子补丁不能像我预期的那样工作呢?

您将变量\uuuuu iter\uuuuuuuuu添加到a。必须将其添加为如下方法:

更新:此答案意外返回True。这只是返回True,因为我设置了iter,然后调用isinstance。如果我首先调用isinstance,然后设置iter,它总是返回False,因为python缓存系统读取user2357112的答案,您将变量uuu iter_uuu添加到a。必须将其添加为如下方法:


更新:此答案意外返回True。这只是返回True,因为我设置了iter,然后调用isinstance。如果我首先调用isinstance,然后设置iter,它总是返回False,因为python缓存系统读取user2357112的答案不支持动态实现或不实现抽象方法。abc机器执行大量缓存以加快iInstance和issubclass检查,并且没有手动重置缓存的选项。A不是Iterable的子类这一事实在第一次isinstance调用后被缓存,导致第二次调用的结果为假

最接近描述缓存行为的是以下行:

不支持向类动态添加抽象方法,或在方法或类创建后尝试修改其抽象状态


不支持动态实现或取消实现抽象方法。abc机器执行大量缓存以加快iInstance和issubclass检查,并且没有手动重置缓存的选项。A不是Iterable的子类这一事实在第一次isinstance调用后被缓存,导致第二次调用的结果为假

最接近描述缓存行为的是以下行:

不支持向类动态添加抽象方法,或在方法或类创建后尝试修改其抽象状态


虽然“iter”确实需要成为一种方法,但将其变成一种方法实际上并不会改变isinstance行为。由于其他原因,您看到了一个真实的结果-您删除了第一个isinstance检查。虽然“iter”确实需要是一个方法,但使其成为一个方法实际上并不会改变isinstance行为。由于其他原因,您看到了一个真实的结果-您删除了第一个isinstance检查。谢谢,我刚刚意识到由于cls中的缓存,实例检查在\uuu instancecheck\uuuuuuuuu中返回了。\u abc\u负\u缓存在跳入\uu子类检查之前。谢谢,我刚刚意识到,由于cls中的缓存,实例检查返回到了\uuuu instancecheck\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
# python3.7
Python 3.7.2 (default, Feb 15 2019, 16:54:46) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections.abc import *
>>> from _collections_abc import _check_methods
>>> class A:
...     pass
... 
>>> a = A()
>>> isinstance(a, Iterable)
False
>>> A.__iter__ = 100
>>> isinstance(a, Iterable)             # why this not working?
False
>>> _check_methods(A, "__iter__")
True
>>> class B:
...     def __iter__(self):
...             pass
... 
>>> isinstance(B(), Iterable)
True
 class A:
     pass

 def foo(self):
     pass

 A.__iter__ = foo
 a = A()
 isinstance(a, Iterable)
 # True