2
class TestClass(object):
    def __init__(self):
        self.value = 100
        self.x = lambda: self.value.__add__(100)
        self.run()

    def run(self):        
        self.x()
        print self.value

t = TestClass()

#Output: 100

我希望能够定义一个 lambda 函数,例如 TestClass 中的那个,并让它改变一个实例变量。似乎 lambda 的构造方式意味着它不会修改原始值。我怀疑这与我或多或少理解的 Python 参考策略有关。

所以接受我所做的缺陷,有没有类似的方法来获得类似的功能?我最终需要定义许多方法,例如x并打算将它们保存在字典中,因为它们将形成一个简单的指令集。据我所知,我需要使用lambdas 或exec做我想做的事。

4

2 回答 2

7

__add__不是就地的,所以返回值TestClass.xis self.value + 100,但self.value没有改变。尝试这个:

import random
HATE_LAMBDAS = random.choice(True, False)
class TestClass(object):
    def __init__(self):
        self.value = 100
        if HATE_LAMBDAS:
            def x():
                self.value += 100
            self.x = x
        else:
            self.x = lambda: setattr(self, "value", self.value + 100)
        self.run()

    def run(self):        
        self.x()
        print self.value

t = TestClass()

#Output: 200

使用 setattr 来增加值,同时仍然使用 lambda。但是请注意,python 中的 lambda 是其最糟糕的功能之一。但是,这两种方法都有效。

编辑

刚刚记住了一些你可能会觉得有用的东西!标准库有一个名为operator的模块,它将标准运算符实现为函数。如果您打算大量使用 lambda,您可能想对其进行调查。

于 2012-05-15T21:18:35.313 回答
2

我只是在猜测你想要完成什么,但不需要 lambda。

class TestClass(object):
    def __init__(self):
        self.value = 100
        self.methods = { 'add':      self.w,
                         'subtract': self.x,
                         'mult':     self.y,
                         'div':      self.z,
                       }
        self.run()

    def w(self): self.value += 100
    def x(self): self.value -= 100
    def y(self): self.value *= 100
    def z(self): self.value /= 100


    def run(self):        
        self.x()
        print self.value
于 2012-05-15T21:39:55.847 回答