栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660105.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号