7

__getattribute__()特別な方法との文脈で以下の優先順位が何を意味するのか理解できませんDescriptors

コアPythonプログラミングtopic("Precedence") - under topic ("Desriptors")の本でこれを3回読んだのですが、それでも理解できません。これらの優先順位とは何か、どこで使用されているのかを誰かが説明できますか?

  • クラス属性
  • データ記述子
  • インスタンス属性
  • 非データ記述子
  • デフォルトは__getattr__()

私はPythonのドキュメントも読みました。そこで私は以下のステートメントを見つけました:-

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

定義されたデータ記述子は**__set__()****__get__()**常にインスタンスディクショナリの再定義を上書きします。対照的に、非データ記述子はインスタンスによってオーバーライドできます。

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

誰かがそれが何であるかを説明するために小さな例をあげることができますfirst paragraphか?override a redefinition in an instance dictionaryまた、「- ?? 」とはどういう意味ですか?

4

1 に答える 1

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__ddcobj.__dict__

次に、非データ記述子について説明します。あなたのコードであなたが呼ぶなら:

cobj.ndd = 2

次に、非データ記述子を非表示にし、cobj.__dict__ 属性nddは常にcobj.__dict__オブジェクトから読み取られます。だからあなたがそうするなら:

cobj.ndd

記述子の__get__メソッドは呼び出されません。ただし、辞書から属性を削除すると、次のようになります。

del cobj.ndd

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

cobj.ndd

__get__記述子のメソッドを呼び出します。

于 2012-09-27T12:15:16.390 に答える