liste der attribute einer klasse?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
killroy84
User
Beiträge: 7
Registriert: Samstag 13. Dezember 2003, 00:28

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
Dookie
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

Code: Alles auswählen

class A:
    def __init__(self):
        self.a = 0
obj = A()
print vars(obj)

{'a': 0}
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__

Code: Alles auswählen

class C(object):
    __slots__ = ["c"]
    def __init__(self):
        self.c = 3
obj = C()
print obj.__slots__

['c']
mit der Funktion getattr(obj, name) kannst Du auf die Attribute einer Klasse über den Namen als String Zugriff erhalten.

Code: Alles auswählen

print getattr(obj, "c")

3
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.

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
killroy84
User
Beiträge: 7
Registriert: Samstag 13. Dezember 2003, 00:28

danke für die schnelle antwort :)
dann werd ich mich gleich mal ransetzen und weiterprobieren 8)
Antworten