Wie alle Attribute/Methoden einer Klasse herausbekommen?

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
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

`print self.__getattribute__("test")` gibt nur das gewünschte Attribut zurück. Ich suche aber eine Funktion die mir alle Methoden und Attribute auflistet. Die zurückgegebenen Attribute/Methoden sollten aber nicht nur als String zurückgegeben werden, sondern als Referenz auf das/die Attribute/Methoden.

Gibt es dafür ein builtin?

beispiel:

Code: Alles auswählen

class AbstractClass(object):
    def __init__(self):   
        print self.__getattribute__("test")
    
    def test(self):
        print "test"
Das gibt mir z.B. folgendes zurück:

Code: Alles auswählen

<bound method AbstractClass.test of <__main__.AbstractClass object at 0x009E7450>>
Das ganze lässt sich dann so aufrufen: `self.__getattribute__("test")()`

Nun würde ich gerne eine Methode wissen die mir alle Attribute/Methoden zurückgibt:
Pseudocode:

Code: Alles auswählen

class AbstractClass(object):
    def __init__(self):
        print self.__get_all_attribute__()
    
    def test(self):
        print "test"

    def test2(self):
        print "test2"
Rauskomme soll dann sowas:

Code: Alles auswählen

[<bound method AbstractClass.test of <__main__.AbstractClass object at 0x009E74B0>>, <bound method AbstractClass.test2 of <__main__.AbstractClass object at 0x009E74B0>>]
Den Sourcecode der Klasse selber zu Parsen ist keine Option wegen Performance und co. Es sollte schon etwas sein das Bestandteil vom Python Core ist :) Daher, wie weiß Python welche Attribute/Methoden in Klasse `X`drin sind und wie kann ich an diese Informationen ohne Umweg kommen?

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

`x = dir(self)` wäre ne Möglichkeit und dann halt die Referenzen mit `self.__getattribute__(x[...])` holen.

Aber irgendwie zu umständlich :?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi sape!

Hier hast du einen kleinen Kopfzerbrecher: :-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

class MyClass(object):
    
    var1 = "Hallo"
    var2 = "Welt"

    def __init__(self):
        self.var3 = "DE"
        self.var4 = "AT"
        
        print "Klasseninstanz:", self.__dict__
        print
        
        print "Klasse:", self.__class__.__dict__
        print
        
        print "test1:",
        t1 = getattr(self, "test1")
        if callable(t1):
            print t1()
        else:
            print t1
        print
        
        print "var3:", self.__dict__["var3"]
        print 
        
        attrs = []
        for key in self.__dict__:
            if not(key.startswith("__") and key.endswith("__")):
                attrs.append(key)
        for key in self.__class__.__dict__:
            if not(key.startswith("__") and key.endswith("__")):
                attrs.append(key)
        for attrname in attrs:
            attr = getattr(self, attrname)
            print "%s:" % attrname, (callable(attr) and attr()) or attr
    
    def test1(self):
        return "test1"
    
    def test2(self):
        return "test2"

mc = MyClass()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Wie wär's mit `inspect.getmembers()`?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi gerold und Jack.

_vielen_ dank. Sowas habe ich gesucht. Hab `inspect.getmembers()` nun benutzt und etwas von dem Code von gerold. Funktioniert super.

thx lg
sape
Antworten