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
記述子を実装する正しい方法は何ですか?