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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage