对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 相关文章推荐
用C++封装MySQL的API的教程
May 06 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
Python基于property实现类的特性操作示例
Jun 15 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
django 简单实现登录验证给你
Nov 06 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
keras实现theano和tensorflow训练的模型相互转换
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中动态显示签名和ip原理
2007/03/28 PHP
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
JS实现简易换图时钟功能分析
2018/01/04 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
python调用shell的方法
2013/11/20 Python
numpy排序与集合运算用法示例
2017/12/15 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
公司财务流程之主管工作流程
2014/03/03 职场文书
球队口号
2014/06/18 职场文书
先进基层党组织材料
2014/12/25 职场文书
施工现场安全管理制度
2015/08/05 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python