Python:装饰一个类方法,该方法在继承时将被覆盖

Python:装饰一个类方法,该方法在继承时将被覆盖,第1张

Python:装饰一个类方法,该方法在继承时将被覆盖

如注释中所建议,让子类覆盖钩子而不是

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()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5666219.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存