2009-09-09 5 views
56

¿Cómo se obtiene una lista de todas las variables en una clase que es iterable? Algo así como los locales(), pero para una claseiterando sobre todas las variables miembro de una clase en python

class Example(object): 
    bool143 = True 
    bool2 = True 
    blah = False 
    foo = True 
    foobar2000 = False 

    def as_list(self) 
     ret = [] 
     for field in XXX: 
      if getattr(self, field): 
       ret.append(field) 
     return ",".join(ret) 

esto debe volver

>>> e = Example() 
>>> e.as_list() 
bool143, bool2, foo 
+0

Por qué no puede utilizar su uso 'para campo en [self.bool143, self.bool2, self.blah, self.foo, self.foobar2000]'? ¿Cómo ocurre que no se conocen las variables de instancia de la clase? –

+4

S.Lott: eso es lo que terminé haciendo de todos modos. En mi código real, tengo como 40 variables, y pensé que sería mejor y más DRY no tener que hacer manualmente la lista de iteraciones. – priestc

+3

Posible duplicado de [iteración sobre atributos de objeto en python] (https://stackoverflow.com/questions/11637293/iterate-over-object-attributes-in-python) –

Respuesta

90
dir(obj) 

le da todos los atributos del objeto. Es necesario para filtrar los miembros de los métodos etc ti mismo:

class Example(object): 
    bool143 = True 
    bool2 = True 
    blah = False 
    foo = True 
    foobar2000 = False 

example = Example() 
members = [attr for attr in dir(example) if not callable(getattr(example, attr)) and not attr.startswith("__")] 
print members 

le dará:

['blah', 'bool143', 'bool2', 'foo', 'foobar2000'] 
+5

por qué crear instancia de un objeto: dir (Ejemplo()) en lugar de solo el tipo de clase dir (Ejemplo) – Erdal

+1

porque supongo que el OP está buscando variables de instancia (que pueden no estar presentes en la clase). – truppo

+4

y ¿cómo se obtienen los valores? – knutole

5
>>> a = Example() 
>>> dir(a) 
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', 
'__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', 'bool143', 'bool2', 'blah', 
'foo', 'foobar2000', 'as_list'] 

— como se ve, que le da todos los atributos, por lo que tendrá que filtrar un poco. Pero básicamente, dir() es lo que estás buscando.

0

La manera más fácil de hacer esto es para salvar a todas las instancias de la clase en un list.

a = Example() 
b = Example() 
all_examples = [ a, b ] 

Los objetos no nacen espontáneamente. Alguna parte de tu programa los creó por una razón. La creación se hace por una razón. Recolectarlos en una lista también se puede hacer por una razón.

Si utiliza una fábrica, puede hacerlo.

class ExampleFactory(object): 
    def __init__(self): 
     self.all_examples= [] 
    def __call__(self, *args, **kw): 
     e = Example(*args, **kw) 
     self.all_examples.append(e) 
     return e 
    def all(self): 
     return all_examples 

makeExample= ExampleFactory() 
a = makeExample() 
b = makeExample() 
for i in makeExample.all(): 
    print i 
+0

Me gusta la idea (podría usarla en un proyecto actual). Sin embargo, no es una respuesta a la pregunta: el OP quiere enumerar los atributos, no las instancias en sí. – balpha

+0

@balpha: Ooops. No leí la pregunta. 90% del tiempo, es un duplicado de "cómo puedo encontrar todas las instancias de una clase". La pregunta real (ahora que la señalas) no es sensata. Ya conoce las variables de instancia, solo haga una lista. –

23

@truppo: su respuesta es casi correcta, pero invocable siempre devolverá falso ya que solo está pasando una cadena. Es necesario algo como lo siguiente:

[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")] 

que filtrará a cabo funciones

70

Si desea que sólo las variables (sin funciones) utiliza:

vars(your_object) 
+3

Aún necesita filtrar __vars__, pero esta es la respuesta correcta – gaborous

+2

realmente me gustaría usar este enfoque para averiguar qué serializar antes de enviar estados a través de la red, por ejemplo ... – Thom

+4

'vars' does * not * incluye las variables de clase, solo las variables de instancia. – DilithiumMatrix

-1
class Employee: 
    ''' 
    This class creates class employee with three attributes 
    and one function or method 
    ''' 

    def __init__(self, first, last, salary): 
     self.first = first 
     self.last = last 
     self.salary = salary 

    def fullname(self): 
     fullname=self.first + ' ' + self.last 
     return fullname 

emp1 = Employee('Abhijeet', 'Pandey', 20000) 
emp2 = Employee('John', 'Smith', 50000) 

print('To get attributes of an instance', set(dir(emp1))-set(dir(Employee))) # you can now loop over 
Cuestiones relacionadas