gpt4 book ai didi

python - 如何将一个类的实例方法 monkeypatch 到另一个类的实例方法?

转载 作者:太空狗 更新时间:2023-10-30 00:56:22 24 4
gpt4 key购买 nike

给定一个类 A 我可以简单地通过 a 添加一个实例方法

def a(self):
pass

A.a = a

但是,如果我尝试添加另一个类 B 的实例方法 b,即 A.b = B.b,尝试调用 A().b() 产生一个

TypeError: unbound method b() must be called with B instance as first argument (got nothing instead)

(而 B().b() 没问题)。确实有区别

A.a -> <unbound method A.a>
A.b -> <unbound method B.b> # should be A.b, not B.b

所以,

  • 如何解决这个问题?
  • 为什么会这样?这看起来并不直观,但通常 Guido 有一些很好的理由......

奇怪的是,这在 Python3 中不再失败......

最佳答案

让我们:

class A(object): pass

class B(object):
def b(self):
print 'self class: ' + self.__class__.__name__

当你在做的时候:

A.b = B.b

您不是将函数附加到A,而是未绑定(bind)方法。因此 python 仅将其添加为标准属性,而不会将其转换为 A-unbounded 方法。解决方法很简单,附上底层函数:

A.b = B.b.__func__

print A.b
# print: <unbound method A.b>
a = A()
a.b()
# print: self class: A

我不知道未绑定(bind)方法和函数之间的所有区别(只是第一个包含第二个),也不知道它们在内部是如何工作的。所以我无法解释它的原因。我的理解是,方法对象(绑定(bind)或未绑定(bind))需要比函数更多的信息和功能,但它需要一个来执行。

我同意将此自动化(更改未绑定(bind)方法的类)可能是一个不错的选择,但我可以找到不这样做的理由。因此令人惊讶的是 python 3 与 python 2 不同。我想找出这个选择的原因。

关于python - 如何将一个类的实例方法 monkeypatch 到另一个类的实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713111/

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