programacion orientada objetos metodos python inheritance decorator

orientada - Python: decorar un método de clase que se debe sobrescribir cuando se hereda



metodos en python (1)

Como se sugiere en los comentarios, dejar que las subclases anulen un gancho en lugar de run probablemente sea lo mejor:

class Task(object): def run(self): # before self.do_run() # after class MyTask(Task): def do_run(self): ... task = MyTask() task.run()

Sin embargo, esta es una forma de hacerlo con un decorador de clase:

def decorate_run(cls): run = getattr(cls, ''run'') def new_run(self): print(''before'') run(self) print(''after'') setattr(cls, ''run'', new_run) return cls class Task(object): pass @decorate_run class MyTask(Task): def run(self): pass task = MyTask() task.run() # prints: # before # after

Otra forma sería usar una metaclase. La ventaja de usar una metaclase sería que las subclases no tendrían que estar decoradas. Task podría convertir en una instancia de la metaclase, y luego todas las subclases de Task heredarían la metaclase automáticamente.

class MetaTask(type): def __init__(cls, name, bases, clsdict): if ''run'' in clsdict: def new_run(self): print(''before'') clsdict[''run''](self) print(''after'') setattr(cls, ''run'', new_run) class Task(object, metaclass=MetaTask): # For Python2: remove metaclass=MetaTask above and uncomment below: # __metaclass__ = MetaTask pass class MyTask(Task): def run(self): #successful override! pass task = MyTask() task.run()

Digamos que tengo alguna clase base:

class Task: def run(self): #override this!

Ahora, quiero que otros subclases Tarea y anule el método run ():

class MyTask(Task): def run(self): #successful override!

Sin embargo, el problema es que hay una lógica que debe tener lugar antes y después del método run () de cada clase que subclasifica Tarea.

Parece que una forma de hacerlo sería definir otro método en la clase base que luego llame al método run (). Sin embargo, quería preguntar, ¿hay alguna manera de lograr esto con los decoradores? ¿Cuál sería la forma más pitónica de hacer esto?