3

YouTube のRaymond Hettingersメンタル ゲームで:

class Validator:

    def __set_name__(self, owner, name):
        self.private_name = f'_{name}'    

    def __get__(self, obj, objtype=None):
        return getattr(obj, self.private_name)

    def __set__(self, obj, value):
        self.validate(value)
        setattr(obj, self.private_name, value)

Daw-Ran Liou はPython 3.6+ での記述子の記述 で次のように述べています。

[...] 組み込み関数 getattr および setattr を使用する代わりに、dictオブジェクトに直接到達する必要があります。これは、組み込み関数が記述子プロトコルによって傍受され、RecursionError が発生するためです。

class Validator:

    def __set_name__(self, owner, name):
        self.name= name
    
    def __get__(self, obj, objtype=None):
        return obj.__dict__[self.name]

    def __set__(self, obj, value):
        self.validate(value)
        obj.__dict__[self.name] = value

しかし、YouTube のMatthew Egans Describing Descriptors は次のように述べています。

from weakref import WeakKeyDictionary

class Validator:
    def __init__(self):
        self.data = WeakKeyDictionary()

    def __get__(self, obj, owner):
        return self.data[obj]

    def __set__(self, obj, value):
        self.validate(value)
        self.data[obj] = value

記述子を実装する正しい方法は何ですか?

4

1 に答える 1