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

上一篇 / 下一篇  2021-10-12 13:04:49

  有时候,我们希望在父类中保留一些方法,子类在继承父类的时候,不准覆盖这些方法。这个功能,在 Java 中叫做@final。
  Python 原生的语句和关键词,无法禁止开发者覆盖父类的某个方法。但是,如果你需要的不是禁止,而是在你不小心覆盖的时候,Python 能提醒你的话,那么 Python 从3.8开始就能原生做到。这就是类型标注中的final关键字。
  要使用这个功能,有一个前提,就是你需要使用 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() 
  运行效果如下图所示:
  可以看到,子类Dog覆盖了父类Animal里面的两个方法walk和dead。现在,我不想让开发者覆盖dead方法,如果发现他覆盖了,就要通过 IDE 发出提醒。这个时候,就可以使用final关键词,如下图所示:
  我们只需要from typing import final,然后使用这个装饰器@final来装饰不想被覆盖的方法,那么,当子类试图覆盖它的时候,IDE 就会通过黄色的背景来提醒你这个地方有问题。
  在 typing 里面,除了final装饰器,还有一个Final类型。这个类型可以用来设定常量,例如:
  from typing import Final 
  PI: Final[float] = 3.141592653 
   
  PI = 3.2 
  运行效果如下图所示:
  但需要注意的是,类型标注起的是提醒的作用,如果你要不顾提醒强行违反也没有问题。
  本文说到的是如何提醒开发者不要覆盖父类方法。我们也可以通过自定义一个装饰器,来实现真正禁止其他人覆盖父类的方法。发现覆盖就报错。

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar