4

内部に複数のプロパティを持つ User クラスがあり、ユーザーがそのプロパティのいずれかにポイントを入力できるようにする User クラスの addPoint メソッドもあります。ただし、最大 500 個のプロパティが存在する可能性があり、誰もが異なるプロパティを持つことができます。したがって、すべてのプロパティを「if: - elif:」でコーディングするのは面倒です。今、これは私がやろうとしたことで、はるかに簡単できれいになります:

class User:
    def __init__(self):
        self.health = 0
        self.speed = 0

    def addPoint(self, property, amount):
        eval("self."+property) = eval("self."+property) + amount

そして今、私がfeをするとき。

u = User()
u.addPoint("health", 5)

私はこれをしたいと思います: self.health = self.health + 5、そしてそれが私がeval()s を使用した理由です。ただし、Python は私にエラーを与えているだけです: can't assign to function call. 関数呼び出し自体を割り当てようとしているのではなくeval()、からの戻り値を割り当てようとしているのですがeval()、これを最も簡単な方法で行うにはどうすればよいでしょうか?

4

4 に答える 4

12

を使用せず、代わりにandをeval()使用します。setattr()getattr()

setattr(self, property, getattr(self, property) + amount)
于 2012-09-02T09:27:09.590 に答える
2

それが最善の解決策かどうかはわかりませんが、次のようにオブジェクトのdict属性を使用できます。

def addPoint(self, property, amount):
    self.__dict__[property] = amount

__dict__attribute には、オブジェクトのすべての属性が格納され、非常にクリーンでシンプルな方法でアクセスできます。

于 2012-09-02T09:33:38.660 に答える
2

dictionaryの代わりにa を使用しますeval()

class User:
    def __init__(self):
        self.health = 0
        self.speed = 0
        self.properties={}

    def addPoint(self, property, amount):
        self.properties[property] =self.properties.get(property,0)+amount 

        #self.properties.get(property,0) returns 0 if the property was not defined
于 2012-09-02T09:27:25.160 に答える
1

Python 標準ライブラリが提供する関数 settattr を使用します - 簡単な例:

>>> class A:
...     def __init__(self):
...         setattr(self, "a", "b")
... 
>>> A().a
'b'
于 2012-09-02T09:29:31.557 に答える