Python 猴打鸭
我用uu iter uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。从中,Iterable仅根据类是否已实现iter来确定 那么,为什么这个猴子补丁不能像我预期的那样工作呢?您将变量\uuuuu iter\uuuuuuuuu添加到a。必须将其添加为如下方法: 更新:此答案意外返回True。这只是返回True,因为我设置了iter,然后调用isinstance。如果我首先调用isinstance,然后设置iter,它总是返回False,因为python缓存系统读取user2357112的答案,您将变量uuu iter_uuu添加到a。必须将其添加为如下方法:Python 猴打鸭,python,isinstance,Python,Isinstance,我用uu iter uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。从中,Iterable仅根据类是否已实现iter来确定 那么,为什么这个猴子补丁不能像我预期的那样工作呢?您将变量\uuuuu iter\uuuuuuuuu添加到a。必须将其添加为如下方法: 更新:此答案意外返回True。这只是返回True,因为我设置了iter,然后调用isinstan
更新:此答案意外返回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