Comment obtenir une liste de toutes les variables d'une classe itérative? Un peu comme les locaux (), mais pour une classe
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)
cela devrait revenir
>>> e = Example()
>>> e.as_list()
bool143, bool2, foo
for field in [ self.bool143, self.bool2, self.blah, self.foo, self.foobar2000 ]
? Comment se fait-il que vous ne connaissiez pas les variables d'instance de la classe?Réponses:
vous donne tous les attributs de l'objet. Vous devez filtrer vous-même les membres des méthodes, etc.:
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 donnera:
['blah', 'bool143', 'bool2', 'foo', 'foobar2000']
la source
callable(attr)
marche? N'est-ce pasattr
une chaîne?vars(Example).items()
ou auvars(instance.__class__).items()
lieu dedir()
si vous voulez vérifier si son appelable ou non parce que dir ne renverra 'string
s comme noms ..Si vous ne voulez que les variables (sans fonctions), utilisez:
la source
vars
n'inclut pas les variables de classe, uniquement les variables d'instance.members = list(vars(example).keys())
as (au moins en python3)vars
renvoie undict
mappage du nom de la variable membre à sa valeur.@truppo: votre réponse est presque correcte, mais callable retournera toujours false puisque vous ne faites que passer une chaîne. Vous avez besoin de quelque chose comme ce qui suit:
[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")]
qui filtrera les fonctions
la source
>>> 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']
- comme vous le voyez, cela vous donne tous les attributs, vous devrez donc filtrer un peu. Mais en gros,
dir()
c'est ce que vous recherchez.la source
row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns} if r else {}
Utilisez ceci.
la source
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
la source
Le moyen le plus simple de procéder consiste à enregistrer toutes les instances de la classe dans un fichier
list
.Les objets ne naissent pas spontanément. Une partie de votre programme les a créés pour une raison. La création est faite pour une raison. Les rassembler dans une liste peut également être fait pour une raison.
Si vous utilisez une usine, vous pouvez le faire.
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
la source