Python:如何访问嵌套描述符中的实例属性?

2024-06-16 09:52:04 发布

您现在位置:Python中文网/ 问答频道 /正文

示例

以下面的例子为例

class Leaf:
    def __get__(self, instance, owner):
        if instance is None:
            return self

        # TODO How to access Root.value here?


class Branch:
    bar = Leaf()


class Root:
    foo = Branch()

    def __init__(self, value):
        self.value = value


if __name__ == '__main__':
    x = Root(20)
    y = Root(30)

    print(x.foo.bar)  # 20

    a = x.foo

    print(a.bar)  # 20
    print(y.foo.bar)  # 30
    print(a.bar)  # 20

InLeaf.__get__instance指向Branch实例。但是,我需要访问value,它是{}的实例成员。在

背景

我的任务是为一个大文件头编写一个解析器。解析器应健壮、快速。因此,我建议使用描述符来延迟解析字段,而不是解析整个头结构。这只允许在需要时对头字段进行解码/编码。 因此,有一个根对象将完整的头保存为bytearray,当一个字段被访问时,它的描述符读取或写入这个bytearray。但是,头结构是分层的,并且包含嵌套字段。因此,我需要从嵌套描述符访问根bytearray。在

相关问题及解决方案

关于实例描述符的类似问题以前也曾提出过。在

1。创建每个实例

解决方案是将描述符添加到实例而不是类中,并将共享值设置为引用。我觉得这有点低效。在

参见Dynamically adding @property in python和{a2}

2。重写__getattribute__

我认为这行不通,因为Branch__getattribute__不知道{}实例。在

3。传播value

在遍历结构时,Branch.__get__会被调用,我们可以在其中存储对根实例的引用,该引用可从Leaf.__get__访问。但是,如果我们混淆了对Root的多个实例的调用,这将不起作用。在


最后,我的问题是,对于这个具体的问题,是否有更好的解决方案?在


Tags: 实例instanceselfbranchgetfoovaluebar