Python v3.7.0

方案一(推荐)

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

import abcclass Animal(metaclass=abc.ABCMeta):@abc.abstractmethoddef speak(self):passclass Dog(Animal):def run(self):passif __name__ == '__main__':dog = Dog()

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

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

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

方案二

指定父类方法抛出NotImplementedError异常

class Animal1():def speak(self):raise NotImplementedErrorclass Dog1(Animal1):def run(self):passif __name__ == '__main__':dog = Dog1()dog.speak()

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

补充

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

class Test:def __init__(self):self.__foo = Truedef __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 = Truedef 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 = '~~~'

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

用Python强制子类重写父类,如此简单就能做到相关推荐

  1. Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性

    一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...

  2. python中子类调用父类的初始化方法

    http://bestchenwu.iteye.com/blog/1044848 http://www.crazyant.net/1303.html 一直不太理解python的初始化方法,今天找了下资 ...

  3. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例

    前言: 今天为大家带来的内容是零基础入门:python中子类继承父类的__init__方法实例!具有不错的参考意义,希望在此能够帮助到各位!(喜欢的话记得点赞转发关注不迷路哦) 使用Python写过面 ...

  4. 子类重写父类变量_为什么在子类中不重写超类的实例变量

    子类重写父类变量 当我们在父类和子类中创建一个具有相同名称的变量,并尝试使用持有子类对象的父类引用访问它时,我们会得到什么? 为了理解这一点,让我们考虑下面的示例,在该示例中,我们在Parent和Ch ...

  5. java 子类重写父类的方法应注意的问题

    若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:     重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写 ...

  6. php重载父类属性,子类重写父类属性的问题。。。。求解惑

    php 子类重写父类属性的问题 sal;}}class Manager extends Employer{protected $sal=5000;public function getParentSa ...

  7. 关于子类重写父类方法的问题

    关于访问修饰符对重写父类方法的影响 结论 代码样例 子类 结论 子类重写父类的方法: 1.父类中私有方法不能被重写.因为父类私有方法子类可理解为被子类继承,但是不被子类可见,不可访问,当然就无法重写了 ...

  8. 子类重写父类构造器以及其他方法

    若父类重写了自身的构造器,并且还实现了自己的方法,那么,当子类继承父类后,重写自身的构造器和重写父类的其他方法时,搭配super()或者super.method()时候,会出现什么现象呢? 先看构造器 ...

  9. 子类重写父类方法,调用时会调用子类重写之后的方法

    1, 以下代码执行的结果显示是多少( )? public class Demo {class Super{ int flag=1;Super(){test();}void test(){System. ...

最新文章

  1. RocketMQ 基本概念
  2. iOS架构-多工程联编及framework之间的相互调用(19)
  3. Linux 小知识翻译 - 「RAID」
  4. 【WebView】warnning:所有WebView方法必须在主线程调用(4.0) 所有WebView方法必须在同一线程调用(4.4)
  5. 13、Spring Boot 2.x 多数据源配置
  6. 三种场景不建议放在关系型数据库中
  7. Html5 Video 节点
  8. Linux prerouting和postrouting的区别
  9. 单片机作业1_为OLED制作汉字字库_第1部分
  10. 编程英语单词1.编程常用英语词汇大全
  11. 英特尔oneAPI—开拓
  12. matlab拟合度R方,...1),问题是什么是拟合优度?、R^2大于多少说明拟合度很好,R^2在...-拟合度-数学-冀群是同学...
  13. 宝塔防火墙可以防ddos攻击吗
  14. python中true什么意思_python中的bool是什么意思
  15. 仿京东PC网页商品详情的放大镜效果(原理+代码)
  16. 阿里云对腾讯企业邮箱设置域名解析
  17. php文本转图片自动换行功能
  18. DZ主题模板 Discuz迪恩淘宝客购物风格商业版模板
  19. 华三MSR路由配置设备管理控制台DMC,实训室
  20. Lua性能优化—Lua内存优化

热门文章

  1. 1002. 查找常用字符
  2. winform checkbox要点击两次_真正牛X的人生,必须经历两次失败!(深度)
  3. lru算法c语言实现单链表,操作系统之LRU算法 C语言链表实现
  4. arm 升腾310_简单说说华为海思的芯片产品线
  5. 标准燃料计算机准,油表显示的油耗真的准确吗?教你最准确的油耗计算方法
  6. cs客户端 实时权限_【CS学习笔记】7、SMBbean的作用
  7. redhat 6安装mysql5.7_RedHat6.5/CentOS6.5安装Mysql5.7.20的教程详解
  8. 06-4.部署高可用 kube-scheduler 集群
  9. 2018下半年软考报名
  10. php7安装redis扩展和memcache扩展