Das Überschreiben __getattr__
sollte in Ordnung sein - __getattr__
wird nur als letztes Mittel aufgerufen, d. H. Wenn in der Instanz keine Attribute vorhanden sind, die mit dem Namen übereinstimmen. Wenn Sie beispielsweise auf foo.bar
zugreifen, wird __getattr__
nur aufgerufen, wenn foo
kein Attribut mit der Bezeichnung bar
hat. Wenn das Attribut ist, das Sie nicht behandeln wollen, heben AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
Doch im Gegensatz zu __getattr__
wird __getattribute__
zuerst genannt werden (funktioniert nur für neue Stilklassen das heißt jene, die von Objekt erben). In diesem Fall können Sie das Standardverhalten wie so erhalten:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
the Python docs for more See.
"Pause", fragt es, nicht "ändern". Das ist klar genug: Die "fancy" Attribute sollten nicht mit eingebauten Attributen interferieren und sollten sich so gut wie möglich verhalten. Michaels Antwort ist sowohl korrekt als auch hilfreich. – olooney