Dekorator, der den Funktionsstatus von Methode zu Funktion ändert
[Aktualisiert]: Inline unter Frage beantworten
Ich habe ein Inspektionsprogramm und ein Ziel ist es, dass die Logik eines Dekorateurs weiß, ob die Funktion, die sie dekoriert, eine Klassenmethode oder eine reguläre Funktion ist. Das scheitert auf seltsame Weise. Unten ist Code, der in Python 2.6 ausgeführt wird:
def decorate(f):
print 'decorator thinks function is', f
return f
class Test(object):
@decorate
def test_call(self):
pass
if __name__ == '__main__':
Test().test_call()
print 'main thinks function is', Test().test_call
Dann bei Ausführung:
decorator thinks function is <function test_call at 0x10041cd70>
main thinks function is <bound method Test.test_call of <__main__.Test object at 0x100425a90>>
Haben Sie eine Ahnung, was falsch läuft, und ob es @decorate möglich ist, richtig auf test_call als Methode zu schließen?
[Antwort] Carls Antwort unten ist fast perfekt. Ich hatte ein Problem bei der Verwendung des Decorators für eine Methode, die Unterklassen aufruft. Ich habe seinen Code so angepasst, dass er einen im_func-Vergleich für Mitglieder der Oberklasse enthält:
ismethod = False
for item in inspect.getmro(type(args[0])):
for x in inspect.getmembers(item):
if 'im_func' in dir(x[1]):
ismethod = x[1].im_func == newf
if ismethod:
break
else:
continue
break