def recursive(func): func.func_globals[func.__name__] = func return func class Test: def method(self, x = False): if x: print(x) else: self.method("I'm method") @staticmethod def smethod(x = False): if x: print(x) else: method("I'm static method") @staticmethod @recursive def rmethod(x = False): if x: print(x) else: rmethod("I'm recursive method") test = Test() test.method() # I'm method test.rmethod() # I'm recursive method test.smethod() # raises NameError: global name 'method' is not defined