在Python动态分配功能的实现(Dynamically assigning function im

2019-07-29 04:58发布

我想动态分配功能的实现。

让我们先从以下几点:

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号线,在调用打印“%s的得到它做的更好”%self.name AttributeError的:“DoItBetter”对象有没有属性“名”

最后,我想分配调用对象实例的属性和调用它:

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.name因为它引用调用的self ,而不是所属的类self

于是我找了一个匿名函数赋值给一个类的函数或实例方法,该方法调用可以引用该对象的一个Python的方式self

Answer 1:

你的第一种方法是好的,你就必须将功能分配到类:

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



Answer 2:

如果你想改变的东西一类的每个实例牦牛的答案的伟大工程。

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

from types import MethodType

doer.doSomething = MethodType(doItBetter, doer, Doer)


文章来源: Dynamically assigning function implementation in Python