对Python3之方法的覆盖与super函数详解


Posted in Python onJune 26, 2019

#覆盖

覆盖:在继承关系中,子类实现了与基类同名的方法,在子类的实例调用该方法时,实例调用的是子类的覆盖版本。

通俗的讲,就是小明继承了他⑧的自行车,经过自己的改装,成了电动车,那么小明每次骑的就是电动车了(这个电动车是可以脚蹬的,后边栗子会继续使用)

举个简单的栗子:

class Bicycle():
  def run(self):
    print('我是自行车的run方法')

class E_Bicycle(Bicycle): # 继承自行车
  def run(self):
    print('我是电动车的run方法')

b = Bicycle()
b.run()

e_b = E_Bicycle()
e_b.run()

打印结果:

我是自行车的run方法
我是电动车的run方法

注意:方法的覆盖必须要同名,例如这个栗子是继承与派生关系,方法还同名,只是print被改变了

这个栗子不是特别明显,改动一点点:

class Bicycle(object):
  def __init__(self, name):
    self.name = name

  def run(self):
    print('我是%s的run方法'%self.name)

class E_Bicycle(Bicycle): # 继承自行车
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def run(self):
    print('我是%s的run方法, 被主人改装%s年了'%(self.name, self.age))

b = Bicycle('自行车')
b.run()

e_b = E_Bicycle('电动车', 3)
e_b.run()

改变了name值,并且加入了age参数。

那么如何调用父类的方法呢或属性呢?

#super
super(cls, obj)返回绑定超类的实例(要去obj必须是cls类型的实例)
super的作用:间接调用父类覆盖方法

举个栗子:

# 示意super函数间接调用父类中被覆盖的方法

class A:
  def work(self):
    print('A.work被调用')

class B(A):
  '''B类继承A类'''
  def work(self):
    print('B.work被调用')

  def super_work(self):
    '''调用B类自己的work方法'''
    self.work() # B.work被调用,调用自身类的方法,和调用属性一样
    super(B, self).work() # A.work被调用, 借助super调用父类被覆盖的方法
    super().work() # A.work被调用 这种必须在方法内使用 ,可以省略(自身类)参数

b = B()
# b.work() # B.work被调用,调自身的类
# super(B, b).work() # A.work被调用(使用super是调用B的父类)
# super().work() # RuntimeError: super(): no arguments  不知道调用谁,所以此种省略参数的只能在内部使用
b.super_work() # 以上懂了,这回也就懂了

显示调用基类的初始化方法:

当子类中实现了__init__(双下划线的init方法,貌似不显示)方法,基类的构造方法并不会被调用,此时需要显示调用

举个栗子:

# 示意显示调用初始化方法
class Human:
  def __init__(self, n, a):
    self.name = n
    self.age = a
    print('Human初始化的方法被调用了')

  def infos(self):
    print('姓名', self.name)
    print('年龄', self.age)

class Student(Human):
  def __init__(self, n, a, s=0): 
    # super(Student, self).__init__(n, a) # 调用父类的初始化方法 复习上边讲的
    super().__init__(n, a) # 调用父类的初始化方法 内部省略参数
    self.score = s # 增加一个属性
    print('Student的初始化方法被调用了')

  def infos(self): # 方法的重写
    super().infos() # 显示调用父类的方法
    print('成绩是:', self.score)

s1 = Student('张三', 20, 80)
s1.infos()

打印结果:

Human初始化的方法被调用了
Student的初始化方法被调用了
姓名 张三
年龄 20
成绩是: 80

对Python3之方法的覆盖与super函数详解

改写上述的自行车与电动车的栗子:

class Bicycle(object):
  def __init__(self, name):
    self.name = name
  
  def run(self):
    print('我是%s的run方法'%self.name)
    
class E_Bicycle(Bicycle): # 继承自行车
  def __init__(self, name, age):
    super().__init__(name) # 调用父类的name属性
    self.age = age
  
  def run(self):
    super().run() # 调用父类的run方法
    print('被主人改装%s年了'%(self.age)

b = Bicycle()
b.run()

e_b = E_Bicycle('电动车', 3)
e_b.run()

对Python3之方法的覆盖与super函数详解

本节就到这吧

以上这篇对Python3之方法的覆盖与super函数详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
web.py在模板中输出美元符号的方法
Aug 26 Python
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
Anaconda入门使用总结
Apr 05 Python
python中的tcp示例详解
Dec 09 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
python中rc1什么意思
Jun 19 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 #Python
python装饰器常见使用方法分析
Jun 26 #Python
解决python super()调用多重继承函数的问题
Jun 26 #Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 #Python
python里dict变成list实例方法
Jun 26 #Python
Python音频操作工具PyAudio上手教程详解
Jun 26 #Python
python3中类的继承以及self和super的区别详解
Jun 26 #Python
You might like
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php中执行系统命令的方法
2015/03/21 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python发送伪造的arp请求
2014/01/09 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
python实现的简单抽奖系统实例
2015/05/22 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
副总经理岗位职责
2014/03/16 职场文书
大班亲子运动会方案
2014/06/10 职场文书
学习张林森心得体会
2014/09/10 职场文书
国际贸易实训报告
2014/11/05 职场文书
债务纠纷起诉书
2015/05/20 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫
Python安装使用Scrapy框架
2022/04/12 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python