gpt4 book ai didi

python - 在 Python 中具有继承类的 Monkey-patching 类

转载 作者:行者123 更新时间:2023-12-04 12:59:26 24 4
gpt4 key购买 nike

阅读 the question about monkey-patching classes in Python 的答案后我尝试将建议的解决方案应用于以下情况。

假设我们有一个模块 a.py

class A(object):
def foo(self):
print(1)

class AA(A):
pass

让我们尝试按如下方式修补它。当我们猴子补丁类时它起作用 A :
>>> import a
>>> class B(object):
... def foo(self):
... print(3)
...
>>> a.A = B
>>> x = a.A()
>>> x.foo()
3

但是如果我们尝试继承的类,它变成没有打补丁:
>>> y = a.AA()
>>> y.foo()
1

有没有办法用它所有继承的类来修补这个类?

编辑

目前,对我来说最好的解决方案如下:
>>> class AB(B, a.AA):
... pass
...
>>> a.AA = AB
>>> x = a.AA()
>>> x.foo()
3
a.AA 的任何复杂结构将被继承和 AB之间的唯一区别和 a.AA将是 foo()方法。通过这种方式,我们不会修改任何内部类属性(如 __base____dict__ )。唯一剩下的缺点是我们需要对每个继承的类都这样做。

这是最好的方法吗?

最佳答案

您需要显式覆盖 a.AA 中的基类元组,虽然我不建议像这样修改类。

>>> import a
>>> class B:
... def foo(self):
... print(2)
...
>>> a.AA.__bases__ = (B,)
>>> a.AA().foo()
2

这也将反射(reflect)在 a.A.__subclasses__() (虽然我并不完全确定它是如何工作的;它是一种方法的事实表明它在运行时以某种方式计算它,而不是简单地返回由 AA 的原始定义修改的值)。

似乎 class 中的基类语句被简单地记住,而不是使用,直到某些操作需要它们(例如在属性查找期间)。可能还有一些其他微妙的极端情况没有被顺利处理:警告程序员。

关于python - 在 Python 中具有继承类的 Monkey-patching 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60560093/

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