Jak uzyskać listę wszystkich zmiennych w klasie, którą można iterować? Trochę jak locals (), ale dla klasy
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)
to powinno powrócić
>>> e = Example()
>>> e.as_list()
bool143, bool2, foo
for field in [ self.bool143, self.bool2, self.blah, self.foo, self.foobar2000 ]
? Jak to się dzieje, że nie znasz zmiennych instancji klasy?Odpowiedzi:
daje wszystkie atrybuty obiektu. Musisz samodzielnie odfiltrować członków z metod itp:
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
Da tobie:
['blah', 'bool143', 'bool2', 'foo', 'foobar2000']
źródło
callable(attr)
działa? Czy to nieattr
jest ciąg?vars(Example).items()
lubvars(instance.__class__).items()
zamiast tego,dir()
czy chcesz sprawdzić, czy jest wywoływalny, czy nie, ponieważ dir zwróci tylkostring
jako nazwy ..Jeśli chcesz tylko zmienne (bez funkcji) użyj:
źródło
vars
ma nie zawierać zmienne klasy, tylko zmienne instancji.members = list(vars(example).keys())
as (przynajmniej w python3)vars
zwracadict
odwzorowanie nazwy zmiennej składowej na jej wartość.@truppo: twoja odpowiedź jest prawie poprawna, ale callable zawsze zwróci false, ponieważ przekazujesz tylko ciąg. Potrzebujesz czegoś takiego:
[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")]
które odfiltrują funkcje
źródło
>>> 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']
- jak widzisz, daje to wszystkie atrybuty, więc będziesz musiał trochę odfiltrować. Ale w zasadzie
dir()
to jest to, czego szukasz.źródło
row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns} if r else {}
Użyj tego.
źródło
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
źródło
Prostym sposobem na to jest zapisanie wszystkich instancji klasy w pliku
list
.Przedmioty nie powstają spontanicznie. Jakaś część twojego programu stworzyła je z jakiegoś powodu. Stworzenie nie bez powodu. Zbieranie ich na liście może mieć również powód.
Jeśli korzystasz z fabryki, możesz to zrobić.
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
źródło