是否可以创建一个支持以下内容的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