La superposition __getattr__
devrait être correcte - __getattr__
est appelée uniquement en dernier recours, c'est-à-dire si aucun attribut de l'instance ne correspond au nom. Par exemple, si vous accédez à foo.bar
, alors __getattr__
ne sera appelé que si foo
n'a pas d'attribut appelé bar
. Si l'attribut est celui 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, contrairement à __getattr__
, __getattribute__
sera appelé en premier (ne fonctionne que pour les nouvelles classes de style à savoir 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 the Python docs for more.
"Break", il demande, pas "changer". C'est assez clair: les attributs «de fantaisie» ne devraient pas interférer avec les attributs intégrés et devraient se comporter autant que possible comme eux. La réponse de Michael est à la fois correcte et utile. – olooney