Seite 1 von 1

liste der attribute einer klasse?

Verfasst: Montag 22. März 2004, 02:07
von killroy84
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

Verfasst: Montag 22. März 2004, 03:32
von Dookie
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

Verfasst: Montag 22. März 2004, 09:39
von killroy84
danke für die schnelle antwort :)
dann werd ich mich gleich mal ransetzen und weiterprobieren 8)