1

記述子のハウツー

誰かが例でこれを理解するのを手伝ってくれませんか?:

インスタンスのディクショナリにデータ記述子と同じ名前のエントリがある場合、データ記述子が優先されます。インスタンスのディクショナリに非データ記述子と同じ名前のエントリがある場合、ディクショナリ エントリが優先されます。

実装は、インスタンス変数よりもデータ記述子に優先順位を与え、非データ記述子よりもインスタンス変数に優先順位を与え、提供されている場合は _ getattr_ () に最低の優先順位を割り当てる優先順位チェーンを通じて機能します。

具体的に私が理解していないのはこれです:

  1. インスタンスのディクショナリに、記述子と同じ名前のエントリを含めるにはどうすればよいですか。例を教えてください。

  2. また、データ記述子がインスタンス変数よりも優先され、インスタンス変数が非データ記述子よりも優先される例を教えてください。

また、以下のコードでは、testclass で __ set __ を呼び出している self.x を見て驚きました: この動作は、上記のリンクの説明によるものだと思います。

オブジェクトの場合、機械は object.__ getattribute __ () にあり、bx を type(b) に変換します。__ 辞書 __ ['x']。__ get __ (b, タイプ(b))。右 ??

    #! /usr/bin/env python
    class descclass(object):

            def __init__(self, value):
                    print "in desc init"
                    self.value = value
                    print "out of desc init"                

            def __get__(self, inst, insttype):
                    print "in desc get"
                    return self.value

            def __set__(self,inst, val):
                    print "in desc set"
                    self.value = val

    class testclass(object):

            x = descclass(100)
            print "desc created"

            def __init__(self, val):
                    print "in testclass init"
                    self.x = val  # this invokes __set__ on descriptor in x
                    print "out of testclass init"

    if __name__ == '__main__':

            t = testclass(45)
            print t.x
            print vars(t)
            print vars(testclass)
4

2 に答える 2

4

これが例です。

# Not a data descriptor because it doesn't define __set__
class NonDataDescriptor(object):
    def __get__(self, obj, objtype):
        return 3

class Namespace(object):

    # Data descriptor - defines both __get__ and __set__
    @property
    def foo(self):
        return 3

    bar = NonDataDescriptor()

x = Namespace()
x.__dict__['foo'] = 4  # We bypass the foo descriptor's __set__ here,
x.bar = 4              # but there's no bar setter, so this one goes to the dict

# x now has foo and bar descriptors and __dict__ entries

print x.foo  # prints 3 - data descriptor wins over instance __dict__ entry
print x.bar  # prints 4 - instance __dict__ entry wins over non-data descriptor
于 2013-08-21T21:35:55.717 に答える
1

記述子は常にクラスの一部です。インスタンスには独自の属性があり、通常はクラスのどの属性よりも優先されます。

データ記述子は、__get____set__メソッドの両方を持つ単純な記述子です。したがって、Python は次のようにします。

  1. データ記述子があるかどうかを確認します。両方のフックを持つ記述子。
  2. インスタンスの属性を探します
  3. クラスで通常の (非データ) 記述子を探します
  4. クラスの通常の属性にフォールバックする

ポイント 3. と 4. は実際には同じことです。記述子は、特定のメソッドを持つクラス属性です。したがって、その属性に記述子フックがない場合、ポイント 4 は実際にはポイント 3 です。

于 2013-08-21T21:48:47.160 に答える