Как отличить метод экземпляра, метод класса, статический метод или функцию в Python 3?
Я хочу различать методы и функции в Python 3. Кроме того, я хочу получить соответствующий класс, если это метод. Мое текущее решение выглядит так:
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
Это работает, но выглядит не элегантно. И я не уверен, что я что-то пропустил. Кто-нибудь знает лучшее решение?
ОБНОВЛЕНИЕ 1Я также хочу получить соответствующий класс, если это метод. Я знаю, как обращаться с методом класса / экземпляра (см. Приведенный выше код), но как я могу получить класс для статического метода?