Seite 1 von 1

Wie alle Attribute/Methoden einer Klasse herausbekommen?

Verfasst: Samstag 23. Dezember 2006, 22:15
von sape
`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

Verfasst: Samstag 23. Dezember 2006, 23:00
von sape
`x = dir(self)` wäre ne Möglichkeit und dann halt die Referenzen mit `self.__getattribute__(x[...])` holen.

Aber irgendwie zu umständlich :?

Verfasst: Samstag 23. Dezember 2006, 23:29
von gerold
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
:-)

Verfasst: Sonntag 24. Dezember 2006, 00:14
von BlackJack
Wie wär's mit `inspect.getmembers()`?

Verfasst: Dienstag 26. Dezember 2006, 08:09
von sape
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