对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 相关文章推荐
django框架如何集成celery进行开发
May 24 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
Python2与Python3的区别实例分析
Apr 11 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 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中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
python绘制地震散点图
2019/06/18 Python
婴儿地球:Baby Earth
2018/12/25 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
国际贸易专业个人求职信格式
2014/02/02 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
小人国观后感
2015/06/11 职场文书