对Python3之方法的覆盖与super函数详解
作者:geek_xiong 发布时间:2023-08-25 19:05:28
标签:Python3,覆盖,super
#覆盖
覆盖:在继承关系中,子类实现了与基类同名的方法,在子类的实例调用该方法时,实例调用的是子类的覆盖版本。
通俗的讲,就是小明继承了他⑧的自行车,经过自己的改装,成了电动车,那么小明每次骑的就是电动车了(这个电动车是可以脚蹬的,后边栗子会继续使用)
举个简单的栗子:
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
改写上述的自行车与电动车的栗子:
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()
本节就到这吧
来源:https://blog.csdn.net/geek_xiong/article/details/82534743


猜你喜欢
- 这里列出了javascript 中的document.execCommand() 的各种参数说明:2D-Position 允许通过
- 单神经元引论对于如花,大美,小明三个因素是如何影响小强这个因素的。这里用到的是多元的线性回归,比较基础from numpy import a
- 什么是Python元类?Python元类是与Python的面向对象编程概念相关的高级功能之一。它确定类的行为,并进一步帮助其修改。用Pyth
- 简介模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网站的升级
- IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者开始关注web标准设计。看着FireFox的市场占有率不
- 我们先从一个常见的Python编程错误开始说起,我已经见过非常多的程序员犯过这种错误了:def do_not_raise(user_defi
- 在下面这3篇文章中我们给出了手工输入代码的信号与槽的使用方法,因为采用这种方法介绍时,会简单一些,如果使用Qt Designer来介绍这些功
- 一,引言开发环境:Pycharm操作系统:Windows 10Pyhon版本:3.9.9需要自行安装Pygame 3(必须)和Python(
- 本节要讲解如下图所示的滑块验证码(更为复杂的滑动拼图验证码在下一篇介绍)。这种验证码机制比较简单:将滑块拖动到滑轨的最右端即可完成验证,如下
- 单例模式单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整
- mysql 8.0.12 的安装,折腾了两天,遇到各种问题,现总结如下:第一步,卸载掉之前安装的MySQL,参考彻底卸载mysql 个人亲测
- 目录什么是websocket?第一步 准备工作第二步 编写聊天室页面第三步 编写后台websocket路由及处理方法第四步 运行看效果小结C
- 效果图实例代码今天我们要用微信小程序实现2048小游戏,效果图如上面所示。游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字
- 有时候我们需要程序截图文章中的部分字符作为摘要显示出来,这时我们一般是只希望提取的字符串是纯文本的,没有如何html标签,如果我们章节用le
- 本文实例讲述了Python实现的读取/更改/写入xml文件操作。分享给大家供大家参考,具体如下:原始文档内容(test.xml):<?
- AJAX:Asynchronous JavaScript And XML--------异步JavaScript和XML
- 一个日期联动选择器javascript源码,年月日联动显示,准确显示日期(包括闰年日期),可自定义日期范围。 【select】 先说清空一个
- 公司运营着的网站,流量很大,网站是交互式的,经常在过了三四个月的时候索引生成的碎片就很多,由于很大一部分页面没有生成静态,这就导致网站在打开
- Python 模块安装一. 打开命令提示符win + R 输入 cmd 点击确定或者win + S 搜索输入 cmd二. 环境变量没有问题的
- 前言图像分割在医学成像、自动驾驶汽车和卫星成像等方面有很多应用,本质其实就是图像像素分类任务,也就是使用深度学习模型为输入图像的每个像素分配