Keep decorator on override method

Question:

I’ve got a parent class with a method used many times and override all the time. This method has a decorator. I would like to reuse the decorator each time I override the methode without using super() or rewrite de decorator

def decorator(method):
   def wrapper(self, *args, **kwargs):
      print("how are you ?")
      method(self, *args, **kwargs)
   return wrapper

class A:
    @decorator
    def method_a(*args, **kwargs):
       pass

class B(A):
    def method_a(*args, **kwargs):
        print("Fine thanks !")

class_b = B()
class_b.method_a()

# How are you ?
# Fine thanks !
Asked By: Chjul

||

Answers:

I think the cleanest way would be to make an additional function, e.g. _method_a that contains the core of a function, and decorated method_a that only calls the other one. In the child classes you can reimplement _method_a, while leaving method_a from inheritance, thus still decorated.

class A:
    @decorator
    def method_a(self, *args, **kwargs):
        return self._method_a(args, kwargs)

    def _method_a(*args, **kwargs):
        pass

class B(A):
    def _method_a(*args, **kwargs):
        print("Fine thanks !")
Answered By: matszwecja
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.