__getattr__ en una clase y no (o tan bien como) una instancia

Sé que puedo escribir código como:

class A : def __getattr__ (self, name) : return name 

para atrapar el acceso a atributos no definidos en una instancia de una clase, por lo que:

 A().ATTR == 'ATTR' 

es cierto Pero, ¿hay alguna manera de hacer esto para la clase en sí? Lo que me gustaría poder es hacer que funcionen las dos líneas siguientes, y que se puedan distinguir (es decir, hay diferentes métodos mágicos llamados, o el método mágico puede indicar cómo se llamó)

 a = A().ATTR b = A.ATTR 

Sospecho que la respuesta es no, pero tal vez haya algo de python ju-ju profundo.

Edición : el problema real es extender una biblioteca de registros activa personalizada de una manera compatible con versiones anteriores. El código ORM soporta código a lo largo de las líneas de

 ar = AR_people() ar.find() name = ar.name 

para acceder a las tablas, donde el name puede asignarse a un nombre de columna que es diferente, por ejemplo, pe_name . Queremos poder escribir algo como

 ar.filter(AR_people.age >= 21) 

y terminar con

 pe_age >= 21 

(al igual que otras bibliotecas ORM), por lo que AR_people.age necesita devolver una instancia de una clase que implementa __ge__ y así sucesivamente para hacer la conversión mágica.

Puedes usar una metaclase :

 In [1]: class meta(type): ...: def __getattr__(self, name): ...: return name ...: ...: In [2]: class A(object): ...: __metaclass__ = meta ...: def __getattr__(self, name): ...: return name ...: ...: In [3]: A().attr Out[3]: 'attr' In [4]: A.attr Out[4]: 'attr' 

Sí tu puedes. Las metaclases son la respuesta.

 class MyMetaclass(type): def __getattr__(cls, name): return "cls.%s" % name class A : __metaclass__ = MyMetaclass def __getattr__ (self, name) : return name print A().ATTR print A.ATTR 

dará salida

 ATTR cls.ATTR