我需要实现这样的行为:Python的递归__getattribute__
obj.attr1.attr2.attr3 --> obj.attr1__attr2__attr3
它看起来像我不得不重写的obj的类__getattribute__
并以某种方式使用Python的描述符。
UPDATE:
我有一个Django项目。
obj是Django的干草堆的信息搜索结果的实例,它包含了很多的Django模型反规范化的数据(user__name
,user__address
),我需要访问它作为result.user.name
兼容性的原因。
更新THC4k的回答是:
如果我有:
class Target(object):
attr1 = 1
attr1__attr2__attr3 = 5
>>> proxy.attr1
1
>>> proxy.attr1.attr2.attr3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'attr2'
任何帮助将非常感激。
为什么你需要这样做?这是用Python语法来玩“魔术游戏”,试图让它做的事情远离它的意义。如果`obj.attr1__attr2`存在并且`obj.attr1`具有`attr2`属性会发生什么?结果不明确。 – 2010-11-22 15:38:39
我这样做是为了支持遗留代码。 obj.attr1永远不会有attr2属性,所以它不是问题。 – 2010-11-22 15:40:45