如何实现虚拟属性层次结构



是否可以创建一个支持以下内容的Python对象?

obj = ...
obj.abc.def = 123
print(obj.abc.def)
x = obj.abc.ghi(1,2,3)

关键是,obj不应该包含所有属性(这些属性可能很多,可能事先不知道(,而是以调用某种处理程序(即handler(obj,'get','abc','def')等(结束,以执行请求的操作并返回其结果。

我所追求的是一种方便的交互使用符号,使用点符号访问对象的特定细节,而不使用对象的对象。

我了解__getattr____setattr__,并且我已经阅读了Python 3中的描述符,也许我应该考虑将__dict__作为映射对象,但当面对a.b.c样式的子属性时,我正在研究所涉及的开放式嵌套。

使用defaultdict可以定义如下树结构:

from collections import defaultdict
def tree():
return defaultdict(tree)

这可以用于在运行中创建任意嵌套的密钥:

t = tree()
t['a']['b']['c'] = 123

使用属性访问,我们可以使用__getattr____setattr__将调用委托给类似递归形式的底层dict:

class Tree:
def __init__(self):
super().__setattr__('t', defaultdict(Tree))
def __getattr__(self, name):
return self.t[name]
def __setattr__(self, name, value):
self.t[name] = value

现在可以通过访问属性来动态生成属性:

t = Tree()
t.a.b.c = 123

最新更新