对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 相关文章推荐
跟老齐学Python之类的细节
Oct 13 Python
python删除服务器文件代码示例
Feb 09 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
python事件驱动event实现详解
Nov 21 Python
python3实现点餐系统
Jan 24 Python
Python给图像添加噪声具体操作
Mar 03 Python
django admin组件使用方法详解
Jul 19 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
Python如何给函数库增加日志功能
Aug 04 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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中数组合并的两种方法及区别介绍
2012/09/14 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
用cssText批量修改样式
2009/08/29 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
python发送HTTP请求的方法小结
2015/07/08 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
解析python的局部变量和全局变量
2019/08/15 Python
利用python进行文件操作
2020/12/04 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
水产养殖学应届生求职信
2013/09/29 职场文书
商务英语求职自荐信范文
2013/12/24 职场文书
会计辞职信范文
2014/01/15 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
电教室标语
2014/06/20 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript