我在动态编程环境中工作,我可能需要定义(或重新定义)类函数。所以请考虑这个例子:
def func(self):
print("hello2 \n")
class ManClass:
def __init__(self):
pass
def func1(self):
print("hello1\n")
a = ManClass()
a.func1()
hello1
a.func2 = func
>>> a.func2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() takes exactly 1 argument (0 given)
如果在类中定义了func2() - a.func2()将被解释为ManClass.func2(a) - 但现在我将其分配到外部,它似乎期待一个参数。我如何解决这个问题,但更重要的是,为什么这两个定义如何相互关联的区别呢?
答案 0 :(得分:2)
您没有将func
添加到该类,而是将其添加到实例中。请改为ManClass.func2 = func
。
a.func2 = func
将func
作为名为a
的实例属性添加到类的func2
实例中,而不是作为实例成员方法(实际上只是特殊处理)基础类对象上的可调用成员。)
或者,您也可以使用MethodType
将成员方法添加到单个实例,正如@jonrsharpe在其答案中指出的那样。
答案 1 :(得分:2)
这是函数和绑定方法之间的区别,其中“bound”是指实例self
。要解决您的问题,您需要创建独立函数MethodType
:
from types import MethodType
a.func2 = MethodType(func, a)
这会将func
绑定到ManClass
实例a
,允许它访问任何实例属性。请注意,此仅影响a
,其他ManClass
实例将保留原始类定义,除非进行类似修补。
只需附加功能
即可a.func2 = func
你仍然可以访问它:
a.func2(None) # will print "hello2 \n"
但它没有获得隐式对象实例self
参数,只是将其视为标准位置参数。