Wie kann ich die Klasse erhalten, die eine Methode in Python definiert hat?
Ich möchte, dass das folgende Beispiel " __main__.FooClass
" druckt :
class FooClass:
def foo_method(self):
print "foo"
class BarClass(FooClass):
pass
bar = BarClass()
print get_class_that_defined_method(bar.foo_method)
python
python-2.6
python-datamodel
Jesse Aldridge
quelle
quelle
Antworten:
quelle
__dict__
! Manchmal__slots__
wird verwendet. Es ist wahrscheinlich besser zugetattr
testen, ob die Methode in der Klasse ist.Python 3
entnehmen Sie bitte diese Antwort .'function' object has no attribute 'im_class'
Vielen Dank an Sr2222 für den Hinweis, dass ich den Punkt verpasst habe ...
Hier ist der korrigierte Ansatz, der genau wie der von Alex ist, aber nichts importieren muss. Ich denke jedoch nicht, dass es eine Verbesserung ist, es sei denn, es gibt eine große Hierarchie geerbter Klassen, da dieser Ansatz stoppt, sobald die definierende Klasse gefunden wird, anstatt die gesamte Vererbung wie
getmro
gewohnt zurückzugeben. Wie gesagt, dies ist ein sehr unwahrscheinliches Szenario.Und das Beispiel:
Die Alex-Lösung liefert die gleichen Ergebnisse. Solange der Alex-Ansatz verwendet werden kann, würde ich ihn anstelle dieses verwenden.
quelle
Cls().meth.__self__
gibt Ihnen nur die InstanzCls
davon ist an diese bestimmte Instanz von gebundenmeth
. Es ist analog zuCls().meth.im_class
. Wenn Sie habenclass SCls(Cls)
,SCls().meth.__self__
erhalten Sie eineSCls
Instanz, keineCls
Instanz. Was das OP will, ist zu bekommenCls
, was anscheinend nur durch Gehen des MRO verfügbar ist, wie es @Alex Martelli tut.Ich weiß nicht, warum niemand dies angesprochen hat oder warum die Top-Antwort 50 positive Stimmen hat, wenn es höllisch langsam ist, aber Sie können auch Folgendes tun:
Für Python 3 glaube ich, dass sich dies geändert hat und Sie müssen sich darum kümmern
.__qualname__
.quelle
Wenn Sie in Python 3 das eigentliche Klassenobjekt benötigen, können Sie Folgendes tun:
Wenn die Funktion zu einer verschachtelten Klasse gehören könnte, müssten Sie wie folgt iterieren:
quelle
Ich fing an, etwas Ähnliches zu tun. Im Grunde war die Idee zu überprüfen, wann eine Methode in einer Basisklasse implementiert wurde oder nicht in einer Unterklasse. Es stellte sich heraus, dass ich nicht feststellen konnte, wann eine Zwischenklasse die Methode tatsächlich implementierte.
Meine Problemumgehung war eigentlich recht einfach; ein Verfahren zum Einstellen Attributs und später seine Anwesenheit zu testen. Hier ist eine Vereinfachung des Ganzen:
UPDATE: Rufen Sie tatsächlich
method()
von aufrun_method()
(ist das nicht der Geist?) Und lassen Sie alle Argumente unverändert an die Methode übergeben.PS: Diese Antwort beantwortet die Frage nicht direkt. IMHO gibt es zwei Gründe, warum man wissen möchte, welche Klasse eine Methode definiert; Erstens müssen Sie mit den Fingern auf eine Klasse im Debug-Code zeigen (z. B. bei der Ausnahmebehandlung), und zweitens müssen Sie feststellen, ob die Methode erneut implementiert wurde (wobei method ein Stub ist, der vom Programmierer implementiert werden soll). Diese Antwort löst diesen zweiten Fall auf andere Weise.
quelle