【发布时间】:2020-07-25 11:03:48
【问题描述】:
在雷蒙德·赫廷斯Mental Game on YouTube:
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 Liu 在Writing descriptors in 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
但是 Matthew Egans Describing Descriptors on YouTube 说:
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
实现描述符的正确方法是什么?
【问题讨论】:
标签: python python-3.6 python-descriptors