如注释中所建议,让子类覆盖钩子而不是
run自身可能是最好的:
class Task(object): def run(self): # before self.do_run() # afterclass MyTask(Task): def do_run(self): ...task = MyTask()task.run()
但是,这是使用类装饰器 可以 实现的一种方法:
def decorate_run(cls): run = getattr(cls, 'run') def new_run(self): print('before') run(self) print('after') setattr(cls, 'run', new_run) return clsclass Task(object): pass@decorate_runclass MyTask(Task): def run(self): passtask = MyTask()task.run()# prints:# before# after
另一种方法是使用元类。使用元类的优点是不必修饰子类。
Task可以成为元类的实例,然后的所有子类
Task将自动继承元类。
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 passclass MyTask(Task): def run(self): #successful override! passtask = MyTask()task.run()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)