2012-02-29 6 views
3

すべて、 タイトルに尋ねると、実行時にDescriptorの__get__メソッドを変更することは可能ですか?私は実行時にオンザフライで装飾され装飾されている機能を持っている状況にあります。私は@propertyと同様に、この関数の結果を属性として利用できるようにしたいと思います。私はそれを研究し、それがディスクリプタであることを発見しましたが、ディスクリプタの__get__メソッドは読み込み専用です。実行時にpythonディスクリプタの__get__メソッドを変更できますか?

class Test(object): 
    def __init__(self): 
     self._x = 10 

    def get_x(self): 
     return self._x 

    @property 
    def x(self): 
     return self.get_x() 

上記のコードは、私が欲しいものを行い、おおよそ、その

  1. に値がコンストラクタ
  2. に設定されている私は私の心のコンテンツへ
  3. instance.xリターンをget_x方法を飾ることができます正しい値

私の問題は、基本的には不要なので、get_xメソッドを作成してください。私はちょうど読み取り専用であるので__get__ xのメソッドを飾ることができませんでした。

背景

私はターンベースの戦略ゲームを書いている、と私は永続的な条件を実装するためにデコレータを使用しています。私はテストケースを使用するときにこれらのデコレータを効果的に実装できますが、計算された値を取得するには、属性アクセスではなく関数呼び出しを使用する必要があります。ユニットを記述する値を取得すると関数や属性が一貫して使用されないため、これは悪い考えです。私はできるなら属性を標準化したいと思う。

答えて

4

あなたは、「読み取り専用」property__get__属性の特徴は、単純な継承を使用して、デフォルトを上書きすることができます。今

class MyProperty(property): pass 

class Test(object): 
    def __init__(self): 
     self._x = 10 

    def get_x(self): 
     return self._x 

    @MyProperty 
    def x(self): 
     return self.get_x() 

test = Test() 

問題あなたはtest.x上、ごText.xプロパティの__get__ attribureを再定義している場合でも、要求Pythonランタイムは、あなたが

MyProperty.__get__ = lambda self,instance,owner: ""the x attribute" 
ようにのみ存在し、それを書き換えることができ MyProperty.__get__(Test.x, test, Test)

を呼び出しますここ

だから、良いオプションは、あなたの完全な制御であなたの財産の属性を取得これから

MyProperty.__get__ = lambda self,instance,owner: self.get(instance,owner) 

のようないくつかのredifineable属性に呼び出す委譲することです。 プロパティのようなオブジェクトごとに別々の型を生成することもできません。 はとても良い場合には、あなたのような何かを行うことができます:

class MyProperty(property): 
    def __get__(self,instance,owner) : 
     if not instance: return self 
     else: return self.get(instance,owner) 

class Test(object): 
    def __init__(self): 
     self._x = 10 

    def get_x(self): 
     return self._x 

    @MyProperty 
    def x(self): pass 

    @MyProperty 
    def y(self): pass 

    x.get = lambda self,clazz: self.get_x() 
    y.get = lambda self,clazz: "the y property of " + clazz.__name__ + " object" 

>>> test = Test() 
>>> test.x 
10 
>>> test.y 
'the y property of Test object' 
+0

おかげで、私はこの本の夕方に見ていきますが、それは私が欲しいものないように見えます。すべてがうまくいくなら、私は答えを受け入れるでしょう。 – mklauber

関連する問題