2016-04-29 6 views
1

公式のデモでhereと記載されているので、次のコードはRetrieving var "x"と表示されます。 Pythonデータ記述子がインスタンス変数として機能しませんでしたか?

class RevealAccess(object): 
    """A data descriptor that sets and returns values 
     normally and prints a message logging their access. 
    """ 

    def __init__(self, initval=None, name='var'): 
     self.val = initval 
     self.name = name 

    def __get__(self, obj, objtype): 
     print 'Retrieving', self.name 
     return self.val 

    def __set__(self, obj, val): 
     print 'Updating', self.name 
     self.val = val 


class MyClass1(object): 
    x = RevealAccess(10, 'var "x"') 

MyClass1().x 

しかし xはインスタンス変数であれば、データ記述子機械が動作しません、次のコードは何も印刷されません。
class MyClass2(object): 
    def __init__(self): 
     self.x = RevealAccess(10, 'var "x"') 

MyClass2().x 

そして、次のコード意志 Retrieving var "x"再び、 hereを説明するように、私は手動でデータ記述子機械を実装している場合。

class MyClass3(object): 
    def __init__(self): 
     self.x = RevealAccess(10, 'var "x"') 

    def __getattribute__(self, key): 
     "Emulate type_getattro() in Objects/typeobject.c" 
     v = object.__getattribute__(self, key) 
     if hasattr(v, '__get__'): 
      return v.__get__(None, self) 
     return v 

MyClass3().x 

したがって、説明されているドキュメントとして実装されていないデフォルトのデータ記述子機械はありますか?

私はpython 2.7.10を使用しています。

答えて

3

ここでの記述方法は間違っています。

以下の方法[__get____set__、及び__delete__]クラス 方法(いわゆるディスクリプタクラス)を含むのインスタンスが 所有者クラスに表示された場合にのみ適用:Python data model正しい記述を有します(記述子は、所有者のクラス ディクショナリまたはその親の1つのクラスディクショナリのいずれかになければなりません)。

記述子はクラス属性でなければなりません。

関連する問題