对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 translator使用实例
Sep 06 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
Python读写配置文件的方法
Jun 03 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
python调用xlsxwriter创建xlsx的方法
May 03 Python
python利用微信公众号实现报警功能
Jun 10 Python
Python unittest单元测试框架总结
Sep 08 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
Python绘制散点图之可视化神器pyecharts
Jul 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
Django forms组件的使用教程
2018/10/08 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
厨师岗位职责
2013/11/12 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
运动会5000米加油稿
2015/07/21 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
pt-archiver 主键自增
2022/04/26 MySQL
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL