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__'
)
AttributeError
bez kontekstu atrybutu w args wyjątku.