gpt4 book ai didi

python - 更改方法定义

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

我想更改类的方法定义。这就是我的情况:

(我从另一个文件导入这些类)

class A(object):
def __init__(self, str):
self.str = str

def method_a(self):
print self.str


class B(object):
def __init__(self, str):
self.a = A(str)

def method_b(self):
self.a.method_a()

#######################################

from module import A, B

def main():
b = B('hello')

def my_method_a(self):
print self.str + 'other definition'

b.a.method_a = my_method_a
b.method_b()

if __name__ == '__main__':
main()

当我尝试执行它时,我得到:

my_method_a() takes exactly 1 argument (0 given)

因为它没有得到“ self ”。

请提供任何帮助。

最佳答案

如果您要运行 type(b.a.method_a)在修补该方法之前,您会看到 <type 'instancemethod'> 。补丁后运行相同的代码会产生 <type 'function'> 。为了使函数作为方法正常工作,它必须是的属性,而不是类的实例。当您手动调用从函数生成方法的魔法时,以下内容将起作用:

b.a.method_a = my_method_a.__get__(b.a, A)

参见https://wiki.python.org/moin/FromFunctionToMethod了解更多信息。

<小时/>

不同的是,当你调用b.a.method_a()时补丁后,method_a实例 b.a 的一个属性,不属于 A 。结果,该函数的 __get__永远不会调用方法来生成 instancemethod已经有 b.a 的对象绑定(bind)到 method_a 的第一个参数.

<小时/>

从一个角度来看,b.a.method_a()A.method_a(b.a) 相同。 Python 如何实现这种转变?您需要了解描述符协议(protocol)。所有函数对象都实现__get__方法返回 instancemethod对象,您可以将其视为第一个参数绑定(bind)到适当对象的原始函数。考虑这段代码:

b = B()
b.a.method_a()
  1. b有一个名为 a 的属性?是的;我们将其设置为 B.__init__ .
  2. b.a有一个属性 method_a ?没有。
  3. type(b.a) (即 A )有一个属性 method_a ?是的。
  4. 调用 A.method_a.__get__(b.a, A) ,自 method_a被查找了一个例子。结果是一个实例方法对象,其第一个参数绑定(bind)到 b.a 。 (这就是为什么您可以认为 b.a.method_a()A.method_a(b.a) 相同)。
  5. 使用零个参数调用生成的实例方法。

现在考虑这段代码。

b = B()
b.a.method_a = my_method_a
b.a.method_a()
  1. b有一个名为 a 的属性?是的;我们将其设置为 B.__init__ .

  2. b.a有一个属性 method_a。我们在尝试调用它之前设置它。

  3. b.a.method_a是实例查找,而不是类查找,未调用描述符协议(protocol)并且 b.a.method_a.__get__没有被调用,即使 my_method_a有一个__get__功能就像其他功能一样。

  4. 调用 b.a.method_a零参数。

    这会产生错误,因为该函数需要一个参数。

关于python - 更改方法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023848/

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