2

例子

举个例子

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,它是 的实例成员Root

背景

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

相关问题和解决方案

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

1.创建一个实例

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

请参阅在 pythonPython 中动态添加 @property - 如何将实例变量值传递给描述符参数?

2.覆盖__getattribute__

我认为这行不通,因为__getattribute__ofBranch不知道该Root实例。

3. 传播value

在遍历结构时,Branch.__get__会调用它,我们可以在其中存储对根实例的引用,该引用可从Leaf.__get__. 但是,如果我们在多个Root.


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

4

0 回答 0