2012-03-22 6 views

Respuesta

13

El método mágico __getattr__ se invoca cuando el atributo no existe en las clases instancia/clase/principal. Que tendría que utilizar para elevar una excepción especial para un atributo que falta:

class Foo(object): 
    def __getattr__(self, attr): 
     #only called what self.attr doesn't exist 
     raise MyCustonException(attr) 

Si desea personalizar el acceso a los atributos de la clase, es necesario definir __getattr__ en la metaclase/Tipo:

class BooType(type): 
    def __getattr__(self, attr): 
     print attr 
     return attr 

class Boo(object): 
    __metaclass__ = BooType 

boo = Boo() 
Boo.asd # prints asd 
boo.asd # raises an AttributeError like normal 

Si desea personalizar el acceso de atributos , use el método mágico __getattribute__.

+0

¿No modifica eso la instancia, no el acceso de atributo de clase? –

+0

@ RomanA.Taycher He ampliado mi respuesta. – agf

2

agf's answer es correcto, y de hecho la respuesta que estoy a punto de dar se basa en ello y le debe algo de crédito.

Sólo para dar más detalles sobre el lado de la clase-atributo, que es la parte que es en realidad bajo pregunta aquí (en contraposición a la diferencia entre __getattr__ y __getattribute__), me gustaría añadir una referencia a an answer I wrote to a different similar question, que va en más detalles sobre la diferencia entre los atributos de clase e instancia, cómo se implementa esto, y por qué necesita usar una metaclase para influir en la búsqueda de atributos de clase.

+2

Oye, su respuesta a la otra pregunta es agradable, pero esta no es realmente una respuesta a esta pregunta. Debe agregar algún contenido aquí o publicarlo como un comentario sobre la pregunta o mi respuesta. – agf

Cuestiones relacionadas