Je veux remplacer la __getattr__
méthode sur une classe pour faire quelque chose de sophistiqué, mais je ne veux pas casser le comportement par défaut.
Quelle est la bonne façon de procéder?
python
getattr
getproperty
gaines
la source
la source
Réponses:
Le remplacement
__getattr__
devrait être bien -__getattr__
n'est appelé qu'en dernier recours, c'est-à-dire s'il n'y a pas d'attributs dans l'instance qui correspondent au nom. Par exemple, si vous accédezfoo.bar
, alors__getattr__
ne sera appelé que sifoo
aucun attribut n'est appelébar
. Si l'attribut est un attribut que vous ne souhaitez pas gérer, augmentezAttributeError
:Cependant, contrairement à
__getattr__
,__getattribute__
sera appelé en premier (ne fonctionne que pour les nouvelles classes de style c'est-à-dire celles qui héritent de l'objet). Dans ce cas, vous pouvez conserver le comportement par défaut comme ceci:Consultez la documentation Python pour en savoir plus .
la source
__getattr__
- des idées quoi faire? (AttributeError: 'super' object has no attribute '__getattr__'
)AttributeError
sans le contexte de l'attribut dans les arguments d'exception.la source
self.__class__.__name__
devrait être utilisé auself.__class__
cas où la classe remplacerait__repr__
Pour étendre la réponse de Michael, si vous souhaitez conserver le comportement par défaut en utilisant
__getattr__
, vous pouvez le faire comme ceci:Maintenant, le message d'exception est plus descriptif:
la source
__getattr__
et__getattribute__
?