I'm making a decorator (using functools) and I need to know if the received function is a function, class method or instance method.
I tried to use type(function)(as said here) to decide at first if it's a function or a method, but I don't understand how Python classifies them: I found that setters and getters are functions, while it should be instance methods cause they receive the parameter self.
Question: How can I distinguish between function (external, static), class methods and instance methods?
Take an example with
- External function
- Static method
- Class method
- Instance method
- Getter
- Setter
import functools
def decorator_show_type(func):
    """Decorator to get the type of setter and getter"""
    @functools.wraps(func)
    def tell(*args, **kwargs):
        show_type(func)
        return func(*args, **kwargs)
    return tell
def show_type(function):
    print(type(function))
def exte():
    print("exte")
class Foo:
    def __init__(self):
        self.var = 0
    @staticmethod
    def stat():
        print("stat")
    @classmethod
    def clas(cls):
        print("clas")
    def inst(self):
        print("inst")
    @property
    @decorator_show_type
    def var(self):
        print("get var")
    @var.setter
    @decorator_show_type
    def var(self, newvar):
        print("set var")
Then, verifying the type of each function/method I get
show_type(exte)  # <class 'function'>
bar = Foo()  # <class 'function'>
             # set var
bar.var  # <class 'function'>
         # get var
show_type(Foo.__init__)  # <class 'function'> 
show_type(Foo.stat)  # <class 'function'>
show_type(Foo.clas)  # <class 'method'>
show_type(Foo.inst)  # <class 'function'>
show_type(bar.__init__)  # <class 'method'>
show_type(bar.stat)  # <class 'function'>
show_type(bar.clas)  # <class 'method'>
show_type(bar.inst)  # <class 'method'>
Motivation: The decorator I want to make verifies the input type of a function and raises error if it's the wrong type, like here. For external functions it works fine, but it fails for class/instance methods due the cls/self which doesn't need a type annotation.
I tried to verify if 'method' in str(type(function)): ignore first argument, but getters and setters are <class 'function'> and have the parameter self.
