对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内置的字符串处理函数整理
Jan 29 Python
17个Python小技巧分享
Jan 23 Python
python中xrange用法分析
Apr 15 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
运动检测ViBe算法python实现代码
Jan 09 Python
python学生信息管理系统
Mar 13 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
Python数据类型之Dict字典实例详解
May 07 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
numpy库reshape用法详解
Apr 19 Python
基于python 取余问题(%)详解
Jun 03 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 上传文件的方法(类)
2009/07/30 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
解析php中const与define的应用区别
2013/06/18 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python常用知识点汇总
2016/05/08 Python
理解python中生成器用法
2017/12/20 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python文字转语音实现过程解析
2019/11/12 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
parser.add_argument中的action使用
2020/04/20 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
厉行勤俭节约倡议书
2014/05/16 职场文书
银行授权委托书范本
2014/10/04 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers