Переопределение __getattr__
должно быть в порядке - __getattr__
вызывается только в качестве крайней меры, т. Е. Если в экземпляре нет атрибутов, соответствующих имени. Например, если вы обращаетесь к foo.bar
, то __getattr__
будет вызываться, только если foo
не имеет атрибута с именем bar
. Если атрибут является тем, который вы не хотите обрабатывать, поднимите AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
Однако, в отличие от __getattr__
, __getattribute__
будет вызываться первым (работает только для новых классов стилей, то есть тех, которые наследуются от объекта). В этом случае вы можете сохранить поведение по умолчанию, например:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
См. документы по Python для получения дополнительной информации .