158 votes

Comment puis-je remplacer __getattr__ en Python sans casser le comportement par défaut?

Je veux remplacer la méthode __getattr__ sur une classe pour faire quelque chose de compliqué, mais je ne veux pas casser le comportement par défaut.

Quelle est la bonne façon de faire cela?

236voto

Michael Williamson Points 6210

Primordial __getattr__ doit être fine - __getattr__ n'est appelée qu'en dernier recours, c'est à dire si il n'y a aucun des attributs de l'instance qui correspondent le nom. Par exemple, si vous accédez foo.bar, alors __getattr__ sera appelée uniquement si foo n'a pas d'attribut appelé bar. Si l'attribut est un que vous ne voulez pas manipuler, soulever AttributeError:

class Foo(object):
    def __getattr__(self, name):
        if some_predicate(name):
            # ...
        else:
            # Default behaviour
            raise AttributeError

Cependant, à la différence de __getattr__, __getattribute__ sera appelé en premier (fonctionne uniquement pour les nouvelles classes de style c'est à dire ceux qui héritent de l'objet). Dans ce cas, vous pouvez conserver le comportement par défaut comme ceci:

class Foo(object):
    def __getattribute__(self, name):
        if some_predicate(name):
            # ...
        else:
            # Default behaviour
            return object.__getattribute__(self, name)

Voir le Python docs pour plus d'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: