J'ai besoin de mettre en œuvre un tel comportement:Python __getattribute__ récursive
obj.attr1.attr2.attr3 --> obj.attr1__attr2__attr3
Il semble que je dois remplacer la classe de obj __getattribute__
et également utiliser les descripteurs de python en quelque sorte.
MISE À JOUR:
J'ai un projet django.
obj est SearchResult l'instance de django-botte de foin, il contient beaucoup de données dénormalisés (user__name
, user__address
) de modèle django, et je dois y accéder comme result.user.name
pour des raisons de compatibilité.
Mise à jour pour la réponse de THC4k:
Et si j'ai:
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'
Toute aide sera très appréciée.
Pourquoi avez-vous besoin de faire cela? C'est jouer à des "jeux de magie" avec la syntaxe Python, en essayant de faire en sorte que les choses soient très loin de ce que ça veut dire. Que se passe-t-il si 'obj.attr1__attr2' existe et' obj.attr1' a un attribut 'attr2'? Les résultats sont ambigus. –
Je fais cela pour supporter le code existant. obj.attr1 n'aura jamais d'attribut attr2 donc ce n'est pas un problème. –
Cette idée est juste cassée. Je veux dire, * vraiment cassé *. Non seulement ce que @Glenn mentionne. Il faut aussi du hackery profond pour implémenter, visser chaque outil d'introspection (et chaque développeur essayant de comprendre le code), et je doute que cela en vaille la peine. – delnan