5

__set__の有無にかかわらず記述子を使用できるという事実についてどこかで読みました__get__

それはどのように機能しますか?

データ記述子としてカウントされますか? それは非データ記述子ですか?

コード例を次に示します。

class Desc:
    def __init__(self, name):
        self.name = name
    def __set__(self, inst, value):
        inst.__dict__[self.name] = value
        print("set", self.name)

class Test:
    attr = Desc("attr")

>>>myinst = Test()
>>> myinst.attr = 1234
set attr
>>> myinst.attr
1234
>>> myinst.attr = 5678
set attr
>>> myinst.attr
5678
4

1 に答える 1

7

例で指定した記述子は、データ記述子です。

属性を設定すると、他のデータ記述子と同様に、最優先され、次のように呼び出されます。

type(myinst).__dict__["attr"].__set__(myinst, 1234)

attrこれは、メソッドに従ってインスタンス辞書に追加されます__set__

属性アクセス時に、記述子が__get__メソッドを持っているかどうかがチェックされますが失敗し、検索が次のようにインスタンスの辞書にリダイレクトされます。

myinst.__dict__["attr"]

インスタンス ディクショナリで見つからない場合は、記述子自体が返されます。

この動作は、次のようにデータ モデルに簡単に記載されています。

が定義されていない場合__get__()、属性にアクセスすると、オブジェクトのインスタンス ディクショナリに値が存在しない限り、記述子オブジェクト自体が返されます。

{instance: value}一般的なユースケースには、記述子内の辞書の回避、および効率的な方法での値のキャッシュが含まれます。


Python 3.6 では__set_name__、記述子プロトコルに追加されたため、記述子内で名前を指定する必要がなくなりました。このように、記述子は次のように記述できます。

class Desc:
    def __set_name__(self, owner, name):
        self.name = name
    def __set__(self, inst, value):
        inst.__dict__[self.name] = value
        print("set", self.name)

class Test:
    attr = Desc()
于 2016-09-26T19:54:31.230 に答える