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

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

在前几天的文章:一日一技:在 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()


运行效果如下图所示:


1.png


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


2.png


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


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


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


运行效果如下图所示:


3.png


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


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


请关注微信公众号【未闻Code】获取更多精彩文章。



目录
相关文章
|
26天前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
WK
|
12天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
65 36
|
23天前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
58 2
11种经典时间序列预测方法:理论、Python实现与应用
|
19天前
|
开发者 Python
Python中的魔法方法与运算符重载
在Python的奇妙世界里,魔法方法(Magic Methods)和运算符重载(Operator Overloading)是两个强大的特性,它们允许开发者以更自然、更直观的方式操作对象。本文将深入探讨这些概念,并通过实例展示如何利用它们来增强代码的可读性和表达力。
|
1月前
|
Python
Python中的push方法详解与实例
Python中的push方法详解与实例
|
27天前
|
Linux Python
Python获得本机本地ip地址的方法
【10月更文挑战第8天】 socket模块包含了丰富的函数和方法,可以获取主机的ip地址,例如gethostbyname方法可以根据主机名获取ip地址,gethostbyname_ex方法可以获得本机所有ip地址列表,也可以使用netifaces模块获取网卡信息。
27 0
|
28天前
|
SQL 安全 数据库
Python防止SQL注入攻击的方法
Python防止SQL注入攻击的方法
40 0
|
29天前
|
Python
Python中tqdm模块的常用方法和示例
`tqdm` 是一个快速、可扩展的Python进度条库,适用于长循环中添加进度提示。通过封装迭代器 `tqdm(iterator)`,可以轻松实现进度显示。支持自定义描述、宽度及嵌套进度条,适用于多种迭代对象。在Jupyter notebook中,可自动调整显示效果。
32 0
|
29天前
|
Python
Python中threading模块的常用方法和示例
Python 的 `threading` 模块提供了多线程编程的能力,允许同时执行多个线程。主要类包括 `Thread`、`Lock` 和 `Condition`。`Thread` 类用于创建和管理线程,`Lock` 用于同步线程,防止资源竞争,`Condition` 用于线程间协调。本文介绍了这些类的常用方法及示例代码,帮助你更好地理解和使用多线程编程。
25 0
|
29天前
|
Shell Python
Python中os模块的常用方法和示例
在Python中,`os`模块提供了与操作系统交互的函数,用于文件和目录管理、路径操作、环境变量等。常用方法包括路径操作(如`os.path.join()`、`os.path.abspath()`)、文件和目录管理(如`os.mkdir()`、`os.remove()`)、环境变量和进程管理(如`os.getenv()`、`os.system()`)以及其他常用功能(如`os.getcwd()`、`os.urandom()`)。
26 0