对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中使用smtplib和email模块发送邮件实例
Apr 22 Python
Python中的类学习笔记
Sep 23 Python
Python使用matplotlib绘制动画的方法
May 20 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
python交互式图形编程实例(三)
Nov 17 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
Python实现简繁体转换
Jun 07 Python
Python测试框架pytest高阶用法全面详解
Jun 01 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
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python检测生僻字的实现方法
2016/10/23 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
结婚喜宴主持词
2014/03/14 职场文书
员工保密承诺书
2014/05/28 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
讲文明倡议书
2015/04/29 职场文书
夏洛特的网观后感
2015/06/15 职场文书
学雷锋活动简报
2015/07/20 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
JavaScript组合继承详解
2021/11/07 Javascript