2

昨夜、次のことに出くわしましたが、それを説明するのにまだ途方に暮れています。

class Foo(object):
    @property
    def dave(self):
        vars(self)['dave'] = 1
        return 2

f = Foo()
print f.dave
print f.dave

このコードを実行すると、以下が生成されます。

2
2

問題はなぜですか?属性アクセスに関する私の理解では、インスタンス ディクショナリはクラス ディクショナリの前にチェックされ、すべてのベースのディクショナリがチェックされますが、上記のように、クラス ディクショナリで記述子が見つかる前にインスタンス ディクショナリがチェックされているようには見えません。

4

1 に答える 1

5

属性アクセスについての私の理解は、インスタンス辞書がクラス辞書の前にチェックされ、すべてのベースの辞書がチェックされるということです

データ記述子は例外です。

インスタンスバインディングの場合、記述子呼び出しの優先順位は、どの記述子メソッドが定義されているかによって異なります。通常、データ記述子は と の両方__get__()を定義します__set__()が、非データ記述子は__get__()メソッドのみを持ちます。データ記述子は、インスタンス ディクショナリの再定義を常にオーバーライドします。対照的に、非データ記述子はインスタンスによってオーバーライドできます。

http://docs.python.org/reference/datamodel.html#invoking-descriptors

于 2009-12-08T10:20:35.683 に答える