gpt4 book ai didi

python - 鸭子打字的猴子补丁

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:35 25 4
gpt4 key购买 nike

# 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

我用 __iter__ 修补了 A,所以 isinstance(a, Iterable) 应该返回 True,因为它由于定义了 __iter__,他现在就像一个可迭代对象。来自source , Iterable 仅根据类是否实现了 __iter__ 来确定。

那么为什么这个猴子补丁没有像我预期的那样工作?

最佳答案

不支持动态实现(或取消实现)抽象方法。 abc 机制做了很多缓存来加速 isinstanceissubclass 检查,并且没有手动重置缓存的选项。 A 不是 Iterable 的子类这一事实在第一次 isinstance 调用后被缓存,导致 False第二次调用的结果。

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

Dynamically adding abstract methods to a class, or attempting to modify the abstraction status of a method or class once it is created, are not supported.

关于python - 鸭子打字的猴子补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55115706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com