¿Cómo se obtiene una lista de todas las variables en una clase que es iterable? Algo así como los lugareños (), pero para una clase
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 debería volver
>>> e = Example()
>>> e.as_list()
bool143, bool2, foo
    
for field in [ self.bool143, self.bool2, self.blah, self.foo, self.foobar2000 ]? ¿Cómo sucede que no conoce las variables de instancia de la clase?Respuestas:
le da todos los atributos del objeto. Debe filtrar los miembros de los métodos, etc. usted 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 membersTe regalaré:
['blah', 'bool143', 'bool2', 'foo', 'foobar2000']fuente
callable(attr)funciona? ¿No esattruna cuerda?vars(Example).items()o envars(instance.__class__).items()lugar dedir()si desea verificar si se puede llamar o no porque dir solo devolverá 'strings como nombres ..Si solo desea las variables (sin funciones) use:
fuente
varsno no incluir las variables de clase, sólo las variables de instancia.members = list(vars(example).keys())as (al menos en python3)varsdevuelve unadictasignación del nombre de la variable miembro a su valor.@truppo: su respuesta es casi correcta, pero invocable siempre devolverá falso ya que solo está pasando una cadena. Necesita algo como lo siguiente:
[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")]que filtrará las funciones
fuente
>>> 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 ve, eso le da todos los atributos, así que tendrá que filtrar un poco. Pero básicamente,
dir()es lo que estás buscando.fuente
row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns} if r else {}Utilizar esta.
fuente
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 overfuente
La forma más sencilla de hacerlo es guardar todas las instancias de la clase en un archivo
list.Los objetos no surgen espontáneamente. Alguna parte de su programa los creó por una razón. La creación se hace por una razón. Recopilarlos en una lista también se puede hacer por una razón.
Si usa una fábrica, puede hacer esto.
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 ifuente