読者です 読者をやめる 読者になる 読者になる

ゆくゆくは有へと

おかゆ/オカ∃/大鹿有生/彼ノ∅有生 の雑記

propertyはデータディスクリプタだからインスタンス属性辞書より優先される

タイトル長くない?

class C():
    def __init__(self):
        self.x = 10

    @property
    def x(self):
        return self.__dict__["x"]

    @x.setter
    def x(self, value):
        print("eh-eh")
        self.__dict__["x"] = value

データディスクリプタインスタンス属性辞書よりもアクセスが優先されるので、上のように書いてもC().xC().__dict__["x"]ではなく、type(obj).__dict__["x"].__get__(obj, type(obj)) に繋がる表現になってくれる。

(単純なフックとして使われてる(?))プロパティ内で用いる属性変数は大抵アンダースコア1つ付けたものにするけど、それだと直接その変数に(比較的簡便に)アクセスできちゃうし、こっちのほうがより隠されてる感はある(単純な属性アクセスではディスクリプタが優先され、無理やりアクセスしようとする場合には__dict__直接覗かないといけないという意味で)