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进程通信之匿名管道实例讲解

    Python进程通信之匿名管道实例讲解

    这篇文章主要介绍了Python进程通信之匿名管道实例讲解,本文直接给出代码实例,代码中包含详细注释,需要的朋友可以参考下
    2015-04-04
  • 简单谈谈python基本数据类型

    简单谈谈python基本数据类型

    在Python中,能够直接处理的数据类型有以下几种:#整型 int,#浮点型 float,#布尔型 bool,#复数型 (在python中用小写 j ,表示虚部,用其他的字母不行)complex
    2018-09-09
  • python解释器pycharm安装及环境变量配置教程图文详解

    python解释器pycharm安装及环境变量配置教程图文详解

    这篇文章主要介绍了python解释器pycharm安装及环境变量配置教程图文详解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 在OpenCV里使用Camshift算法的实现

    在OpenCV里使用Camshift算法的实现

    这篇文章主要介绍了在OpenCV里使用Camshift算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • python使用yield压平嵌套字典的超简单方法

    python使用yield压平嵌套字典的超简单方法

    这篇文章主要给大家介绍了关于python使用yield压平嵌套字典的超简单方法,文中通过示例代码介绍的非常详细,对大家的学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • Python编程中NotImplementedError的使用方法

    Python编程中NotImplementedError的使用方法

    下面小编就为大家分享一篇Python编程中NotImplementedError的使用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python 字典的使用详解及实例代码

    Python 字典的使用详解及实例代码

    今天小编帮大家简单介绍下Python的一种数据结构: 字典,字典是 另一种可变容器模型,且可存储任意类型对象,它用于存放具有映射关系的数据,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-11-11
  • Python中使用aiohttp模拟服务器出现错误问题及解决方法

    Python中使用aiohttp模拟服务器出现错误问题及解决方法

    这篇文章主要介绍了Python中使用aiohttp模拟服务器出现错误,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Python实现批量梯度下降法(BGD)拟合曲线

    Python实现批量梯度下降法(BGD)拟合曲线

    这篇文章主要介绍了Python实现批量梯度下降法(BGD)拟合曲线,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 基于python+selenium的二次封装的实现

    基于python+selenium的二次封装的实现

    这篇文章主要介绍了基于python+selenium的二次封装的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01

最新评论