howdy,
ich wollte mal als übung eine matrizen klasse schreiben, und stehe nun vor der frage, ob es eine methode gibt, die eine liste gibt aller attribute einer klasse liefert.
ich wollte nämlich eine debugausgabe aller attribute haben, ohne jedes mal wenn ein neues attribut hinzukommt, das in der ausgabemethode auch hinzufügen zu müssen. geht das irgendwie?
es sollte auch möglich sein mit den einzelnen listenelementen dann auf die attribute zugreifen zu können. Also z.B. so:
print matrix.attributes[0]
so, dass ich alle attribute mit ihren werten in einer for schleife ausgeben kann
hoffe meine frage ist halbwegs verständlich formuliert
danke im voraus
k84
liste der attribute einer klasse?
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi killroy84,
Bei "oldstyle" Klassen, steht die eingebaute Funktion vars zur Verfügung, sie gibt die Attribute mit ihren Werten als Dictionary zurück
vars gibt auch die Attribute, die in einer Elternklasse definiert wurden aus.
Wenn die Klasse eine "newstyle" Klasse ist, welche mit __slots__ arbeitet, stehen die Attributnamen in der Liste __slots__
mit der Funktion getattr(obj, name) kannst Du auf die Attribute einer Klasse über den Namen als String Zugriff erhalten.
Achtung, es werden nicht die Attribute von Elternklassen einer Klasse in __slots__ festgehalten. Um auch die Attribute die in einer Elternklasse definiert wurden auszugeben musst Du eine recursive Funktion schreiben.
Gruß
Dookie
Bei "oldstyle" Klassen, steht die eingebaute Funktion vars zur Verfügung, sie gibt die Attribute mit ihren Werten als Dictionary zurück
Code: Alles auswählen
class A:
def __init__(self):
self.a = 0
obj = A()
print vars(obj)
{'a': 0}
Wenn die Klasse eine "newstyle" Klasse ist, welche mit __slots__ arbeitet, stehen die Attributnamen in der Liste __slots__
Code: Alles auswählen
class C(object):
__slots__ = ["c"]
def __init__(self):
self.c = 3
obj = C()
print obj.__slots__
['c']
Code: Alles auswählen
print getattr(obj, "c")
3
Code: Alles auswählen
class C(object):
__slots__ = ["c"]
def __init__(self):
self.c = 3
class D(C):
__slots__ = ["d"]
def __init__(self):
super(D,self).__init__()
self.d = 4
def print_attrs(obj, cls=None, ind=0):
inds = "\t"*ind # Einrückung
if cls is None: cls = obj.__class__ # Klasse des Objekts
print "%sAttribute von Klasse %s:" % (inds, cls.__name__)
if hasattr(cls, "__slots__"):
for attr in cls.__slots__:
print "%s %s =" % (inds, attr), getattr(obj, attr)
else:
print "%s (keine Attriubte definiert)" % (inds,)
for parent in cls.__bases__:
print_attrs(obj, parent, ind+1)
test = D()
print_attrs(test)
Gruß
Dookie