python描述符经常需要将数据与它管理的每个实例相关联。基本上有两种方法可以做到这一点。第一种方法是使用一个名义上对描述符唯一的标签将数据粘贴到每个实例上(可能取决于其他信息):
class MyDescriptor(object):
def __init__(self, label):
self.label = make_label_based_on(label)
def __get__(self, inst, cls):
if inst is not None:
return getattr(inst, self.label)
else:
...
def __set__(self, inst, val):
setattr(inst, self.label, val)
另一种策略是将数据存储在描述符内部:
class MyDescriptor(object):
def __init__(self):
self.data = {}
def __get__(self, inst, cls):
if inst is not None:
return self.data[inst]
else:
...
def __set__(self, inst, val):
self.data[inst] = val
不要介意data
中缺少密钥的情况,或者实例无法清除的情况;这不是重点,我already know how to deal with that。
我的直觉说第二种策略要好得多,因为它对托管实例的侵入性较小。例如,它不依赖于唯一的属性命名。我想知道是否有其他考虑因素。
我的问题是:在选择这两种策略时,是否应该考虑名称冲突之外的任何考虑事项?