Wie unterscheide ich eine Instanzmethode, eine Klassenmethode, eine statische Methode oder eine Funktion in Python 3?

Ich möchte in Python 3 zwischen Methoden und Funktionen unterscheiden. Außerdem möchte ich die entsprechende Klasse erhalten, wenn es sich um eine Methode handelt. Meine aktuelle Lösung sieht so aus:

import types
import inspect

def function_or_method(f):
    if inspect.ismethod(f):
        if inspect.isclass(f.__self__):
            print("class method")
            klass = f.__self__
        else:
            print("instance method")
            klass = f.__self__.__class__
    elif inspect.isfunction(f): # function
        if f.__name__ != f.__qualname__: # to distiguish staticmethod and function
            print("static method")
            # HOW TO GET THE CLASS
        else:
            print("function")
    else:
        print("not function or method")

class Foo():
    def bari(self):
        pass
    @classmethod
    def barc(cls):
        pass
    @staticmethod
    def bars():
        pass

def barf():
    pass

function_or_method(Foo().bari) # instance method
function_or_method(Foo.barc) # class method
function_or_method(Foo.bars) # static method
function_or_method(barf) # function

Es funktioniert, sieht aber nicht elegant aus. Und ich bin mir nicht sicher, ob ich etwas verpasst habe. Kennt jemand eine bessere Lösung?

UPDATE 1: Ich möchte auch die entsprechende Klasse erhalten, wenn es sich um eine Methode handelt. Ich weiß, wie man mit Klassen- / Instanzmethoden umgeht (siehe obigen Code), aber wie kann ich die Klasse für die statische Methode erhalten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage