对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正则表达式re模块详细介绍
May 29 Python
Python标准异常和异常处理详解
Feb 02 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python实现list由于numpy array的转换
Apr 04 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
深入浅析Python传值与传址
Jul 10 Python
Django重置migrations文件的方法步骤
May 01 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 Python
python中K-means算法基础知识点
Jan 25 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 IPV6正则表达式验证代码
2010/02/16 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
PHP _construct()函数讲解
2019/02/03 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
JS实现标签页效果(配合css)
2013/04/03 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
innerText 使用示例
2014/01/23 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
基于openlayers实现角度测量功能
2020/09/28 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
浅谈Python中函数的参数传递
2016/06/21 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
幼儿园教研活动方案
2014/01/19 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
尊师重教主题班会
2015/08/14 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
JavaScript组合继承详解
2021/11/07 Javascript