如何使用setattr定义实例的自定义函数

时间:2019-09-03 15:52:58

标签: python python-3.x

我试图动态地向类添加方法,但是我一直遇到错误,其中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'

我在做什么错了?

2 个答案:

答案 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的答案来实现所需的功能。

希望有帮助。

干杯!