Python强制子类重写父类的两种方法实现

 更新时间:2024年02月23日 11:28:55   作者:软件测试君  
在Python中,有时候我们希望某个类能够被子类继承并重写其中的某些方法,本文主要介绍了Python强制子类重写父类的两种方法实现,具有一定的参考价值,感兴趣的可以了解一下

Python v3.7.0

方案一(推荐)

定义抽象基类,只要把一个方法定义成抽象方法,那解释器就会要求子类必须重写这个方法,要注意的是,如果抽象方法没有被重写,那么子类在实例化时,就会抛出TypeError异常,而不需要等到调用函数。

import abc

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass

class Dog(Animal):
    def run(self):
        pass

if __name__ == '__main__':
    dog = Dog()

运行以上代码,会抛出异常:

TypeError: Can't instantiate abstract class Dog with abstract methods speak

只有在Dog子类中,重写speak方法,才可以正常实例化子类。

方案二

指定父类方法抛出NotImplementedError异常

class Animal1():
    def speak(self):
        raise NotImplementedError

class Dog1(Animal1):
    def run(self):
        pass

if __name__ == '__main__':
    dog = Dog1()
    dog.speak()

子类中若没有重写speak方法,也可以正常实例化,但是调用此方法时,就会抛出NotImplementedError异常。

补充

在父类中定义的私有方法,其作用范围仅在当前类,若在子类中重写,实际上并不会起效果,原因:以双下划线前缀开头的属性或方法,Python解释器会重写其名称,以便在类被扩展的时候不容易产生冲突,这被称之为名称修饰(name mangling),如下所示:

class Test:
    def __init__(self):
        self.__foo = True

    def __bar(self):
        return "bar"

t = Test()
print(dir(t))
print(t._Test__foo)
print(t._Test__bar())

输出内容如下,注意列表前两个值,这同时也说明在Python中是没有绝对私有的变量或方法的。

['_Test__bar', '_Test__foo', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
True
bar

在类的继承中,如果在子类中重写了父类方法,但有时也希望能同时实现父类的功能,最常见的场景之一就是父类构造方法中的初始值无法被继承,可以在子类中使用super 函数来调用父类中的方法,特别是多重继承的情况;如下面的例子:

class Animal:
    def __init__(self):
        self.hungry = True

    def eat(self):
        if self.hungry:
            print('No!')
        else:
            print('Yes!')


class Bird(Animal):
    def __init__(self):
        self.song = '~~~'

    def sing(self):
        print(self.song)

bird = Bird()
bird.sing()   # 正常
bird.eat()    # 抛出异常:AttributeError: 'Bird' object has no attribute 'hungry'

解决的方法是在子类的构造函数中,使用super方法调用父类的构造函数,如下:

class Bird(Animal):
    def __init__(self):
        super().__init__()
        self.song = '~~~'

到此这篇关于Python强制子类重写父类的两种方法实现的文章就介绍到这了,更多相关Python强制子类重写父类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • python根据时间生成mongodb的ObjectId的方法

    python根据时间生成mongodb的ObjectId的方法

    这篇文章主要介绍了python根据时间生成mongodb的ObjectId的方法,涉及Python操作mongodb数据库的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • python通过tcp发送xml报文的方法

    python通过tcp发送xml报文的方法

    今天小编就为大家分享一篇python通过tcp发送xml报文的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python+kivy BoxLayout布局示例代码详解

    Python+kivy BoxLayout布局示例代码详解

    这篇文章主要介绍了Python+kivy BoxLayout布局的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • python快速编写单行注释多行注释的方法

    python快速编写单行注释多行注释的方法

    在本篇文章里小编给大家整理的是关于python快速编写单行注释多行注释的方法,有此需要的朋友们可以参考学习下。
    2019-07-07
  • python生成随机图形验证码详解

    python生成随机图形验证码详解

    这篇文章主要介绍了python生成随机图形验证码详解,具有一定参考价值,需要的朋友可以参阅。
    2017-11-11
  • python中字典(Dictionary)用法实例详解

    python中字典(Dictionary)用法实例详解

    这篇文章主要介绍了python中字典(Dictionary)用法,以实例形式较为详细的分析了Python字典建立、添加、删除等常见操作技巧,需要的朋友可以参考下
    2015-05-05
  • 基于python实现弱密码检测工具

    基于python实现弱密码检测工具

    Python中一个强大的加密模块,提供了许多常见的加密算法和工具,本文我们将使用Python编写一个弱密码检测工具,感兴趣的小伙伴可以了解一下
    2024-01-01
  • 从零带你使用Python实现RAG(检索增强生成)系统

    从零带你使用Python实现RAG(检索增强生成)系统

    检索增强生成(Retrieval-Augmented Generation, RAG)是当下最热门的 AI 应用架构之一,本文将带你从零开始,用 Python 完整实现一个 RAG 系统,涵盖文档加载,文本分块,向量嵌入,语义检索与生成回答的完整链路
    2026-04-04
  • python爬虫之场内ETF基金获取

    python爬虫之场内ETF基金获取

    这篇文章主要介绍了python爬虫之场内ETF基金获取,ETF 是一种场内交易型基金,可以在盘中进行交易,交易性比场外基金强一点,下文基于python的相关资料展开,需要的小伙伴可以参考一下
    2022-05-05
  • Python selenium模拟网页点击爬虫交管12123违章数据

    Python selenium模拟网页点击爬虫交管12123违章数据

    本次介绍怎么以模拟点击方式进入交管12123爬取车辆违章数据,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论