gpt4 book ai didi

python - 为什么 self 不会自动传递给实例化后在对象上设置的方法?

转载 作者:太空狗 更新时间:2023-10-29 18:16:16 26 4
gpt4 key购买 nike

 class Person():
pass;
def say_hi(self):
print 'hii'

me=Person()
me.say_hi=say_hi
me.say_hi()

self 参数不是在 python 中自动传递的吗?为什么调用 me.say_hi() 会给出堆栈跟踪?

Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: say_hi() takes exactly 1 argument (0 given)

最佳答案

它不会按照您的方式传递。

你必须这样做。

import types

me.say_hi = types.MethodType(say_hi, me, Person)

让它工作。

当python实例化一个类时,它本质上是对每个类方法执行上述过程。当您以尝试的方式将方法“猴子修补”到对象上时,它不是绑定(bind)方法,只是作为 instance.__dict__ 。调用它与调用任何其他函数没有什么不同。如果你想在一个实例上粘贴一个方法,你必须手动使它成为一个方法,如上所示。

如果你要这样做

class Person(object):
pass

def say_hi(self):
print 'hii'

Person.say_hi = say_hi

me = Person()
me.say_hi()

那么它就可以工作了,因为 Python 会为你创建方法。


Chris Morgan 提出了 answer这显示了这个在行动中。这是好东西。

关于python - 为什么 self 不会自动传递给实例化后在对象上设置的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4267459/

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