example español python getattr getproperty

example - getattr python español



¿Cómo anulo__getattr__ en Python sin romper el comportamiento predeterminado? (3)

Para ampliar la respuesta de Michael, si desea mantener el comportamiento predeterminado con __getattr__ , puede hacerlo así:

class Foo(object): def __getattr__(self, name): if name == ''something'': return 42 # Default behaviour return self.__getattribute__(name)

Ahora el mensaje de excepción es más descriptivo:

>>> foo.something 42 >>> foo.error Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in __getattr__ AttributeError: ''Foo'' object has no attribute ''error''

Quiero anular el método __getattr__ en una clase para hacer algo elegante, pero no quiero romper el comportamiento predeterminado.

¿Cuál es la forma correcta de hacer esto?


__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 accede a foo.bar , entonces __getattr__ solo se __getattr__ si foo no tiene ningún atributo llamado bar . Si el atributo es uno que no desea manejar, suba 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 (solo funciona para las nuevas clases de estilo, es decir, aquellas que heredan del objeto). En este caso, puede conservar el comportamiento predeterminado de esta manera:

class Foo(object): def __getattribute__(self, name): if some_predicate(name): # ... else: # Default behaviour return object.__getattribute__(self, name)

Ver los documentos de Python para más .


class A(object): def __init__(self): self.a = 42 def __getattr__(self, attr): if attr in ["b", "c"]: return 42 raise AttributeError("%r object has no attribute %r" % (self.__class__, attr)) # exception text copied from Python2.6

>>> a = A() >>> a.a 42 >>> a.b 42 >>> a.missing Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 8, in __getattr__ AttributeError: ''A'' object has no attribute ''missing'' >>> hasattr(a, "b") True >>> hasattr(a, "missing") False