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

TestClassのようなラムダ関数を定義して、インスタンス変数を変更できるようにしたいと思います。ラムダの構築方法は、元の値を変更しないことを意味しているように思われます。これは、私が多かれ少なかれ理解しているPythonの参照戦略に関係しているのではないかと思います。

それで、私がしたことの欠陥を受け入れると、同様の機能を取得するための同様の方法はありますか?最終的には、のような多くのメソッドを定義する必要があり、xそれらは単純な命令セットを形成するため、辞書に保持する予定です。私が知る限り、lambdasを使用するかexec、やりたいことをする必要があります。

4

2 に答える 2

7

__add__はインプレースではないため、の戻り値はTestClass.xですがself.value + 100self.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を使用して、ラムダを使用しながら値をインクリメントします。ただし、Pythonのラムダは最悪の機能の1つであることに注意してください。ただし、どちらの方法でも機能します。

編集

あなたが役に立つと思うかもしれない何かを思い出してください!標準ライブラリには、関数として標準演算子を実装する演算子と呼ばれるモジュールがあります。ラムダを頻繁に使用する予定がある場合は、調査することをお勧めします。

于 2012-05-15T21:18:35.313 に答える
2

私はあなたが何を達成したいのかを推測しているだけですが、ラムダは必要ありません。

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 に答える