一日一技:如何让 Python 提醒你不能覆盖某个父类方法?

举报
未闻Code 发表于 2022/01/26 20:13:31 2022/01/26
【摘要】 有时候,我们希望在父类中保留一些方法,子类在继承父类的时候,不准覆盖这些方法。Python 原生的语句和关键词,无法禁止开发者覆盖父类的某个方法。但是,如果你需要的不是禁止,而是在你不小心覆盖的时候,Python 能提醒你的话,那么 Python 从3.8开始就能原生做到,这就是类型标注中的final关键字。

在前几天的文章:一日一技:在 Python 里面如何实现一个抽象类中,我们讲到Python 可以实现一个抽象类。抽象类里面有一些抽象方法,在继承这个抽象类的时候,子类必须实现这些抽象方法。

有时候,我们希望在父类中保留一些方法,子类在继承父类的时候,不准覆盖这些方法。这个功能,在 Java 中叫做@final

Python 原生的语句和关键词,无法禁止开发者覆盖父类的某个方法。但是,如果你需要的不是禁止,而是在你不小心覆盖的时候,Python 能提醒你的话,那么 Python 从3.8开始就能原生做到。这就是类型标注中的final关键字。

如果你不知道什么叫做类型标注,或者不知道它有什么用,那么你可以看我以前的两篇文章:《一日一技:在Python中使用类型标注》、《一日一技:通过Python 3的类型标注提高PyCharm的自动补全能力》。

要使用这个功能,有一个前提,就是你需要使用 PyCharm 或者 VSCode 这种支持识别类型标注的 IDE,或者你的项目使用 mypy 来做静态检查。我们以 PyCharm 为例。

打开 PyCharm,我们来写一个类:

class Animal:
    def walk(self):
        ...

    def dead(self):
        print('所有生物都会死亡,没有例外')


class Dog(Animal):
    def __init__(self, name):
        self.name = name
    
    def walk(self):
        print('使用四只脚走路')

    def dead(self):
        print('狗不会死亡')


wangcai = Dog('旺财')
wangcai.walk()
wangcai.dead()

运行效果如下图所示:

12.png

可以看到,子类Dog覆盖了父类Animal里面的两个方法walkdead。现在,我不想让开发者覆盖dead方法,如果发现他覆盖了,就要通过 IDE 发出提醒。这个时候,就可以使用final关键词,如下图所示:

13.png

我们只需要from typing import final,然后使用这个装饰器@final来装饰不想被覆盖的方法,那么,当子类试图覆盖它的时候,IDE 就会通过黄色的背景来提醒你这个地方有问题。

在 typing 里面,除了final装饰器,还有一个Final类型。这个类型可以用来设定常量,例如:

from typing import Final
PI: Final[float] = 3.141592653

PI = 3.2

运行效果如下图所示:

14.png

但需要注意的是,类型标注起的是提醒的作用,如果你要不顾提醒强行违反也没有问题。

本文说到的是如何提醒开发者不要覆盖父类方法。我们也可以通过自定义一个装饰器,来实现真正禁止其他人覆盖父类的方法。发现覆盖就报错。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。