在Python中动态分配函数实现

Yar*_*rin 13 python anonymous-methods callable anonymous-function

我想动态分配一个函数实现.

让我们从以下开始:

class Doer(object):

    def __init__(self):
        self.name = "Bob"

    def doSomething(self):
        print "%s got it done" % self.name

def doItBetter(self):
    print "Done better"
Run Code Online (Sandbox Code Playgroud)

在其他语言中,我们将使doItBetter成为匿名函数并将其分配给对象.但是不支持Python中的匿名函数.相反,我们将尝试创建一个可调用的类实例,并将其分配给该类:

class Doer(object):

    def __init__(self):
        self.name = "Bob"

class DoItBetter(object):

    def __call__(self):
        print "%s got it done better" % self.name

Doer.doSomething = DoItBetter()
doer = Doer()
doer.doSomething()
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

回溯(最近一次调用最后一次):第13行,在doer.doSomething()第9行,在调用 打印"%s让它做得更好"%self.name AttributeError:'DoItBetter'对象没有属性'name'

最后,我尝试将callable作为属性分配给对象实例并调用它:

class Doer(object):

    def __init__(self):
        self.name = "Bob"

class DoItBetter(object):

    def __call__(self):
        print "%s got it done better" % self.name


doer = Doer()
doer.doSomething = DoItBetter()
doer.doSomething()
Run Code Online (Sandbox Code Playgroud)

只要我不在DoItBetter中引用self,这就可以工作,但是当我这样做时,它会给我一个名称错误,self.name因为它引用了callable self,而不是拥有类self.

所以我正在寻找一种pythonic方法来为类函数或实例方法分配匿名函数,其中方法调用可以引用对象的self.

yak*_*yak 28

你的第一种方法是好的,你只需将该功能分配给该类:

class Doer(object):
    def __init__(self):
        self.name = "Bob"

    def doSomething(self):
        print "%s got it done" % self.name

def doItBetter(self):
    print "%s got it done better" % self.name

Doer.doSomething = doItBetter
Run Code Online (Sandbox Code Playgroud)

匿名函数与此无关(顺便说一句,Python支持由单个表达式组成的简单匿名函数,请参阅参考资料lambda).

  • +1 匿名在这里并不重要 - 重要的是您可以分配一个功能。 (2认同)

Amb*_*ber 24

如果你想为一个班级的每个实例改变一些东西,牦牛的答案会很有效.

如果只想为对象的特定实例更改方法,而不是为整个类更改方法,则需要使用MethodType类型构造函数来创建绑定方法:

from types import MethodType

doer.doSomething = MethodType(doItBetter, doer, Doer)
Run Code Online (Sandbox Code Playgroud)

  • 至少在Python 3中,它应该是`doer.doSomething = MethodType(doItBetter,doer)`。http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance中对方法和函数的不同情况进行了很好的解释。 (2认同)