¿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 members
Te regalaré:
['blah', 'bool143', 'bool2', 'foo', 'foobar2000']
fuente
callable(attr)
funciona? ¿No esattr
una cuerda?vars(Example).items()
o envars(instance.__class__).items()
lugar dedir()
si desea verificar si se puede llamar o no porque dir solo devolverá 'string
s como nombres ..Si solo desea las variables (sin funciones) use:
fuente
vars
no no incluir las variables de clase, sólo las variables de instancia.members = list(vars(example).keys())
as (al menos en python3)vars
devuelve unadict
asignació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 over
fuente
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 i
fuente