我试图动态地向类添加方法,但是我一直遇到错误,其中self
没有传递给新函数。例如:
class Dummy():
def say_hi(self):
print("hi")
def new_method(self):
print("bye")
dummy = Dummy()
setattr(dummy, "say_bye", new_method)
dummy.say_bye()
导致以下错误:
Traceback (most recent call last):
File "main.py", line 13, in <module>
dummy.say_bye()
TypeError: new_method() missing 1 required positional argument: 'self'
我在做什么错了?
答案 0 :(得分:3)
使用types.MethodType
功能:
from types import MethodType
class Dummy():
def say_hi(self):
print("hi")
def new_method(self):
print("bye")
dummy = Dummy()
dummy.say_bye = MethodType(new_method, dummy)
dummy.say_bye() # bye
答案 1 :(得分:1)
您正在将函数new_method
设置为dummy
对象的属性。
如果您执行print(dummy.__dict__)
,将会看到类似这样的内容:
{'say_bye': <function new_method at 0x7fcd949af668>}
这意味着您的dummy
对象具有函数new_method
作为属性,因此,当您执行dummy.say_bye()
时,您将调用具有属性的函数而没有任何参数。
它不是Dummy
类的函数,而只是dummy
对象具有的函数。
您可以使用RomanPerekhrest的答案来实现所需的功能。
希望有帮助。
干杯!