类定义之外的Python函数赋值会导致参数异常

时间:2014-01-15 22:43:57

标签: python function-pointers

我在动态编程环境中工作,我可能需要定义(或重新定义)类函数。所以请考虑这个例子:

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) - 但现在我将其分配到外部,它似乎期待一个参数。我如何解决这个问题,但更重要的是,为什么这两个定义如何相互关联的区别呢?

2 个答案:

答案 0 :(得分:2)

您没有将func添加到该类,而是将其添加到实例中。请改为ManClass.func2 = func

a.func2 = funcfunc作为名为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参数,只是将其视为标准位置参数。