对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实现的一个p2p文件传输实例
Jun 04 Python
python中列表元素连接方法join用法实例
Apr 07 Python
python安装教程
Feb 28 Python
python实现对csv文件的列的内容读取
Jul 04 Python
Python函数装饰器实现方法详解
Dec 22 Python
浅谈python3.6的tkinter运行问题
Feb 22 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
Django 项目重命名的实现步骤解析
Aug 14 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
Python Selenium实现无可视化界面过程解析
Aug 25 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
python通过函数名调用函数的几种方法总结
Jun 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添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
老师自我鉴定范文
2013/12/25 职场文书
关于母亲节的感言
2014/02/04 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
2016年五一促销广告语
2016/01/28 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python