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

时间:2018-02-07 22:31:13

标签: python python-3.x nested lazy-evaluation python-descriptors

实施例

采取以下示例

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

Leaf.__get__ instance指向Branch个实例。但是,我需要访问valueRoot的实例成员。

背景

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

相关问题和解决方案

之前提出过类似的关于实例描述符的问题。

1。创建每个实例

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

请参阅Dynamically adding @property in pythonPython - How to pass instance variable value to descriptor parameter?

2。覆盖__getattribute__

我认为这不会起作用,因为__getattribute__的{​​{1}}不了解Branch个实例。

第3。传播Root

在遍历结构时,value被调用,我们可以存储对根实例的引用,可以从Branch.__get__访问。但是,如果我们在Leaf.__get__的多个实例上混淆调用,则无法执行此操作。

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

0 个答案:

没有答案