Мне нужно реализовать такое поведение:Python рекурсивно __getattribute__
obj.attr1.attr2.attr3 --> obj.attr1__attr2__attr3
Похоже, что я должен переопределить OBJ в класс __getattribute__
, а также использовать питона дескрипторы каким-то образом.
UPDATE:
У меня есть проект Джанго.
OBJ является экземпляром SearchResult Джанго стога сена, он содержит много де нормализованные данные (user__name
, user__address
) от Джанго модели, и мне нужно, чтобы получить доступ к нему, как result.user.name
по соображениям совместимости.
UPDATE для ответа 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