2011-05-03 20 views

Respuesta

15

Se podría agregar una función a su clase que se ve algo como esto:

def properties(self): 
    class_items = self.__class__.__dict__.iteritems() 
    return dict((k, getattr(self, k)) 
       for k, v in class_items 
       if isinstance(v, property)) 

Este busca cualquier propiedad en la clase y luego crea un diccionario con una entrada para cada propiedad con el valor de la instancia actual.

+0

lovely! precisamente lo que buscaba. gracias –

+2

Tenga en cuenta que esto solo enumera las propiedades declaradas en la clase en sí IIRC. Las propiedades de las superclases no aparecerán en la lista. –

+2

Puedes caminar self .__ class __. Mro() para encontrar clases para padres. –

0

dir(obj) proporciona una lista de todos los atributos de obj, incluyendo métodos y atributos.

+0

derecho, pero necesito conocer las propiedades específicamente. Consideré sobrescribir el decorador '@ property' para agregarlos a un registro en' obj', pero calculé que Python probablemente tiene una fantasía '__something__' que ya hace esto. –

4

Las propiedades son parte de la clase, no de la instancia. Así que hay que mirar a self.__class__.__dict__ o equivalentemente vars(type(self))

Así las propiedades serían

[k for k, v in vars(type(self)).items() if isinstance(v, property)] 
+1

+1 me gusta la comprensión de la lista en k, v :) –

2

Para que un objeto f, esto da la lista de miembros que son propiedades:

[n for n in dir(f) if isinstance(getattr(f.__class__, n), property)] 
+0

+1 - pero eso es solo una lista de palabras clave, ¿correcto? –

+0

sí. Las otras soluciones son más completas. –

Cuestiones relacionadas