Python 如何在描述符中处理实例数据?

Python 如何在描述符中处理实例数据?,python,descriptor,Python,Descriptor,python描述符经常需要将数据关联到它所管理的每个实例。基本上有两种方法可以做到这一点。第一种方法是使用描述符名义上唯一的标签(可能取决于其他信息)将数据粘贴到每个实例上: 另一种策略是在描述符内部存储数据: class MyDescriptor(object): def __init__(self): self.data = {} def __get__(self, inst, cls): if inst is not None:

python描述符经常需要将数据关联到它所管理的每个实例。基本上有两种方法可以做到这一点。第一种方法是使用描述符名义上唯一的标签(可能取决于其他信息)将数据粘贴到每个实例上:

另一种策略是在描述符内部存储数据:

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
不要介意
数据中缺少密钥或实例不可散列的情况;这不是重点,我也是

我的直觉告诉我,第二种策略更好,因为它对托管实例的侵入性更小。例如,它不依赖于唯一的属性命名。我想知道是否还有其他考虑


我的问题是:在选择这两种策略时,除了名称冲突之外,还有什么需要考虑的因素吗?

这不是一个完整的答案,但您的第一种方法是使用Python的名称混乱语法:
def\uu get\uuuuuuuuuu(self、inst、cls):如果inst不是None:return inst.u some_label
这假设您在给定类中永远不会有多个描述符副本(这可能是合理的假设,也可能不是合理的假设)。@Blckknght:“这假设您在给定类中永远不会有多个描述符副本”对我来说完全是个阻碍。当然,可以使用双下划线名称和用户提供的标签。但这不是问题所在。我的问题特别问除了名字冲突还有什么重要的考虑因素。是的,这就是为什么这是一个评论,而不是一个答案。如果你只需要一些非常简单的东西,名字弄乱是非常方便的,但是如果你需要更多的东西,它并没有多大帮助。
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