1

setattr(self, item, value)関数を使用して、クラス外の Python クラス プロパティを設定しようとしています。

class MyClass:
    def getMyProperty(self):
        return self.__my_property

    def setMyProperty(self, value):
        if value is None:
            value = ''
        self.__my_property = value

    my_property = property( getMyProperty, setMyProperty )

別のスクリプトでは、インスタンスを作成し、プロパティを指定して、プロパティ ミューテータに単純な検証を処理させたいと考えています。

myClass = MyClass()
new_value = None

# notice the property in quotes
setattr(myClass, 'my_property', new_value)

問題は、 setMyProperty(self, value) mutatorを呼び出しているように見えないことです。呼び出されないことを確認する簡単なテストのために、ミューテーターを次のように変更します。

    def setMyProperty(self, value):
        raise ValueError('WTF! Why are you not being called?')
        if value is None:
            value = ''
        self.__my_property = value

私はPythonにかなり慣れていないので、おそらく私がやろうとしていることを別の方法で行うことができますが、setattr(self, item, value)が呼び出されたときにミューテーターが呼び出されない理由を誰かが説明できますか?

文字列を介してプロパティを設定する別の方法はありますか? プロパティ値を設定するときに、ミューテーター内の検証を実行する必要があります。

4

1 に答える 1

4

私のために働く:

>>> class MyClass(object):
...   def get(self): return 10
...   def setprop(self, val): raise ValueError("hax%s"%str(val))
...   prop = property(get, setprop)
...
>>> i = MyClass()
>>> i.prop =4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in setprop
ValueError: hax4
>>> i.prop
10
>>> setattr(i, 'prop', 12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in setprop
ValueError: hax12

あなたが貼り付けたコードは、私のクラスがから継承することを除いて、私のものと同じように見えますが、それobjectは私がPython 2.6を実行していて、2.7ではすべてのクラスが自動的にobject. ただし、それを試して、それが役立つかどうかを確認してください。

さらに明確にするために:ただやってみてくださいmyClass.my_property = 4。それは例外を発生させますか?そうでない場合は、からの継承に関する問題ですobject- プロパティは、新しいスタイルのクラス、つまり から継承するクラスに対してのみ機能しobjectます。

于 2011-03-12T22:59:50.353 に答える