python - 在 Python 中动态分配函数实现

标签 python anonymous-function anonymous-methods callable

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

让我们从以下内容开始:

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

这给了我这个:

Traceback (most recent call last): Line 13, in doer.doSomething() Line 9, in call print "%s got it done better" % self.name AttributeError: 'DoItBetter' object has no attribute '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

最佳答案

您的第一种方法没问题,您只需将函数分配给类即可:

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

关于python - 在 Python 中动态分配函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374527/

相关文章:

javascript - 在 Jupyter/iPython notebook 中以图形方式选择几何对象

python - 没有 csrf_token 的 Django 1.4

c#-4.0 - C# 4.0 匿名函数

python - 如何以有效的方式截断 numpy/scipy 指数分布?

php使用匿名函数动态计算变量

php - 除了使用 php 的 eval 之外,还有其他方法可以调用此函数吗?

C#,从后台线程调用匿名方法(Action<>)

c# - Action<T> vs 匿名方法问题

c# - LINQ vs Lambda vs 匿名方法 vs 委托(delegate)

python - pandas_ml 更改混淆矩阵图像大小