python 传递给 class 函数的上下文

python context of passed-to-class function

在我的模型中,我有一个 class 包含一个相当通用的函数,它调用一个高阶函数。我整理了一个简单的例子:

class AClass(object):

    def __init__(self, prop, fun):
        self.prop = prop
        self.fun = fun

    def do_sth(self):
        self.fun()

def namely_this_(context):
    print 2*context.prop

obj1 = AClass(3, namely_this_)
obj1.do_sth()

此代码段包含所有要知道的内容,请注意,它可以通过以下内容继续:

def namely_this_2(self):
    print 4*self.prop
obj2 = AClass(2, namely_this_2)

obj2.do_sth()

上面的代码没有运行,而是抛出一个

TypeError: namely_this_() takes exactly 1 argument (0 given)

相反,我必须将 do_sth 更改为

    def do_sth(self):
        self.fun(self) # the *self* in the parenthesis added

问题namely_this_ 与 class 中定义的函数有何不同?我的变通方法是否可行?

实例方法是 class 的 属性,而不是实例本身。如果您将 init 更改为将 fun 分配给 self.__class__.fun,它将起作用;当然,除此之外,所有实例都将共享相同的功能,这显然不是您想要的。

为了让它成为一个实际的方法,你需要让它成为 types.MethodType:

的一个实例
def __init__(self, prop, fun):
    self.prop = prop
    self.fun = types.MethodType(fun, self)