Python中动态分配函数的实现

问题描述 投票:14回答:2

我想动态分配功能实现。

让我们开始以下内容:

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"

在其他语言中,我们将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()

这给了我这个:

追踪(最近一次通话):第13行,在doer.doSomething()第9行,位于[[call打印“%s做得更好”%self.name AttributeError:'DoItBetter'对象没有属性'name'

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

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()

只要我不在DoItBetter中引用self,它就可以工作,但是当我这样做时,它在self.name上给我一个名称错误,因为它引用了可调用对象的self,而不是所属类self

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

python anonymous-function anonymous-methods callable
2个回答
29
投票
您的第一种方法是好的,您只需将函数分配给类:

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

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

25
投票
如果您想为类的每个实例更改某些内容,y牛的答案非常有用。

[如果只想更改对象的特定

instance而不是整个类的方法,则需要使用MethodType类型的构造函数来创建绑定方法:

from types import MethodType doer.doSomething = MethodType(doItBetter, doer)
© www.soinside.com 2019 - 2024. All rights reserved.