Reemplazar __getattr__
debería estar bien - __getattr__
solo se llama como último recurso, es decir, si no hay atributos en la instancia que coincidan con el nombre. Por ejemplo, si tiene acceso a foo.bar
, solo se llamará a __getattr__
si foo
no tiene ningún atributo llamado bar
. Si el atributo es uno que no desea manejar, subir AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
Sin embargo, a diferencia de __getattr__
, __getattribute__
se llamará primero (sólo funciona para las nuevas clases de estilos es decir, aquellos que heredan de objetos). En este caso, puede conservar el comportamiento por defecto de este modo:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
Ver the Python docs for more.
"Romper", pregunta, no "cambiar". Eso es suficientemente claro: los atributos "sofisticados" no deberían interferir con los atributos integrados y deberían comportarse tanto como les sea posible. La respuesta de Michael es correcta y útil. – olooney