3

すべて、タイトルが尋ねるように、__get__実行時に記述子のメソッドを変更することは可能ですか。私は、実行時にオンザフライで装飾されたり装飾されていない機能を持っている状況にあります。この関数の結果を属性として利用できるようにしたいと考えて@propertyいます。私はそれを調査し、記述子であることがわかりましたが、記述子の__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. get_xメソッドを思う存分飾れる
  3. instance.x正しい値を返します

私の問題は、get_x基本的に不要なので、メソッドを作成する必要がないことです。__get__x のメソッドは読み取り専用である ため、修飾できませんでした。

バックグラウンド

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

4

1 に答える 1

5

単純な継承を使用して、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()

__get__Text.x プロパティの属性を再定義しても、test.x要求に応じて Python ランタイムが呼び出されるという問題が発生しました。MyProperty.__get__(Test.x, test, Test)

したがって、次のようにのみ書き換えることができます

MyProperty.__get__ = lambda self,instance,owner: ""the x attribute"

ここでの良いオプションは、次のような再定義可能な属性への呼び出しを委任することです

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

これからは、完全に制御できるプロパティの属性を取得します。また、プロパティのようなオブジェクトごとに個別のタイプを生成するという不適切なオプションもあります。したがって、場合によっては、次のようなことができます。

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'
于 2012-02-29T05:21:01.847 に答える