Chcę zastąpić __getattr__metodę na klasie, aby zrobić coś wymyślnego, ale nie chcę przerywać domyślnego zachowania.
Jak to zrobić w odpowiedni sposób?
Chcę zastąpić __getattr__metodę na klasie, aby zrobić coś wymyślnego, ale nie chcę przerywać domyślnego zachowania.
Jak to zrobić w odpowiedni sposób?
Odpowiedzi:
Przesłanianie __getattr__powinno być w porządku - __getattr__jest wywoływane tylko w ostateczności, tj. Jeśli w instancji nie ma atrybutów pasujących do nazwy. Na przykład, jeśli uzyskasz dostęp foo.bar, __getattr__zostanie wywołany tylko wtedy, gdy nie zostanie wywołany foożaden atrybut bar. Jeśli atrybut nie jest obsługiwany, podnieś AttributeError:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
Jednak w przeciwieństwie do __getattr__, __getattribute__zostanie wywołany jako pierwszy (działa tylko dla klas nowego stylu, tj. Dziedziczących po obiekcie). W takim przypadku możesz zachować domyślne zachowanie:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
__getattr__żadnych pomysłów, co robić? ( AttributeError: 'super' object has no attribute '__getattr__')
AttributeErrorbez kontekstu atrybutu w args wyjątku.