2012-09-27 8 views
7

私は以下の優先順位が何をするかを理解することはできませんが、__getattribute__()特別な方法とDescriptors記述子:__getattributeて属性アクセスのも優先()__

の文脈においては、私はまだ、本からtopic("Precedence") - under topic ("Desriptors")Core Python Programming 3回これを読んでそれを通過することはできません..これらの優先順位は何であるか、そしてそれらがどこで使用されているのかを説明できますか?

  • クラスのインスタンスは、私も、私は以下の文を見つけたpython documentationを、読ん__getattr__()

にデフォルト設定

  • 非データディスクリプタ
  • 属性
  • データ記述子を属性: -

    インスタンスバインディングの場合、ディスクリプタ呼び出しの優先順位は、どのディスクリプタメソッドが定義されているかによって異なります( )。記述子は、 __get__(),__set__()および__delete__()の任意の組み合わせを定義できます。 が__get__()を定義していない場合は、オブジェクトの インスタンス辞書に値がない限り、属性にアクセスすると 記述子オブジェクト自体が返されます。記述子が__set__()および/または __delete__()の場合は、データ記述子です。どちらも定義されていない場合は、非データ記述子です。通常、データディスクリプタは__get__()__set__()の両方を定義し、データディスクリプタは__get__() メソッドのみを定義します。

    **__set__()****__get__()**のデータ記述子は、常に のインスタンスディクショナリの再定義を上書きします。対照的に、非データの 記述子は、インスタンスによって上書きされる可能性があります。

    staticmethod()classmethod()を含むPythonメソッドは、非データ記述子として実装された です。したがって、インスタンスは メソッドを再定義してオーバーライドできます。これにより、個々のインスタンス は、同じクラスの他のインスタンスと異なる動作を取得できます。

    誰かがfirst paragraphについて何かを説明する小さな例はありますか? また、 - override a redefinition in an instance dictionaryと言ってどういう意味ですか?

  • +0

    関連:[どのディスクリプタで最初にディスクリプタが見つかるのですか?](http://stackoverflow.com/questions/1865902/)、[Descriptors and python-provided attributes](http://stackoverflow.com)/question/10536539 /) –

    +0

    @PiotrDobrogost ..これらのリンクのためのPiotrありがとう.. :) –

    答えて

    4

    は、クラスがあるとします。

    class C(object): 
        dd = MyDataDescriptor() 
        ndd = MyNonDataDescriptor() 
        def __init__(self): 
         self.__value = 1 
    

    はのは、データ記述子で最初に見てみましょう。あなたのコードでこれを行うと:

    cobj = C() 
    cobj.dd 
    

    をそれに応じて上記の段落に、cobj.__dict__オブジェクトは常にdd属性がアクセスされたときに、記述子オブジェクトのすなわち__get__/__set__/__del__方法は、常に代わりに使用されますが上書きされます辞書。唯一の例外は、記述子オブジェクトが__get__メソッドを定義していない場合に発生します。次に、cobj.__dict__オブジェクトにddキーがある場合、その値が読み取られます。そうでない場合は、ディスクリプタオブジェクト自体が返されます。

    ここで、非データ記述子の場合。あなたのコード内で呼び出す場合:

    cobj.ndd = 2 
    

    はその後 cobj.__dict__ 皮革非データディスクリプタと ndd属性は常に cobj.__dict__オブジェクトから読み込まれます。あなたが行うのであれば:

    cobj.ndd 
    

    を記述子の__get__方法は呼び出されません。あなたは辞書から属性を削除した場合でも:

    del cobj.ndd 
    

    を、その後の記述子が帰ってきたので、

    cobj.ndd 
    

    を呼び出すと、ディスクリプタに__get__メソッドを呼び出します。

    +0

    そんなに素敵で丁寧な説明のためにso sooをよくありがとう..すべての私の疑問は今クリアされています..もう一度ありがとう:) –

    関連する問題