1、重写

在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个特点我们成为叫做方法的重写(覆盖:override)。

故事继续:徒弟掌握了师父和学院派技术后,自己潜心钻研出自己的独门配方的一套全新的煎饼果子技术。

# 1.创建师父类,属性和方法
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]' def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子') # 2.创建学院派类 属性和方法
class School(object):
def __init__(self):
self.kongfu = '[学院派煎饼果子配方]' def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子') # 3.独创配方
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]' def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子') # 4. 用徒弟类创建对象,调用实例属性和方法
tudi = Prentice()
print(tudi.kongfu)
tudi.make_cake()
"""
输出结果
[独创煎饼果子配方]
运用[独创煎饼果子配方]制作煎饼果子
"""

结论:子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。

拓展:

当我们调用一个对象的方法时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用。

如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法。

如果没有,则去父类的父类中寻找,以此类推,直到找到object,如果依然没有找到,则报错。

2、super()函数

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super() 函数来实现。

实际需求就是:子类调用父类的同名方法和属性。

方式一

故事继续:虽然自己独创的煎饼果子配方非常受欢迎,但是还是有顾客都希望也能吃到古法和学院技术的煎饼果子。

# 1.创建师父类,属性和方法
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]' def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子') # 2. 定义徒弟类,继承师父类
# 添加和父类同名的属性和方法
class Prentice(Master):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]' # 子类的make_cake(self)方法
def make_cake(self):
"""
加自己的初始化的原因:
如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,
如果不加这个自己的初始化,
kongfu属性值是上一次调用的init内的kongfu属性值 执行方式如下:
# 创建一个子类对象
tudi = Prentice()
# 调用执行父类中的make_cake()方法
tudi.make_master_cake()
# 调用子类中的make_cake()
tudi.make_cake()
就能看到劫、结果。 所以在调用属性前,先调用自己子类的初始化,要记住。
"""
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子') # 调用父类的make_cake()方法
# 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
# 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化
def make_master_cake(self):
# 父类类名.函数()
# 再次调用初始化的原因:这里想要调用父类的同名方法和属性,
# 属性在init初始化位置,所以需要再次调用init
Master.__init__(self)
Master.make_cake(self) # 3 . 用徒弟类创建对象,调用实例属性和方法
# 创建一个子类对象
tudi = Prentice() # 调用执行父类中的make_cake()方法
tudi.make_master_cake() # 调用子类中的make_cake()
tudi.make_cake() """
输出结果:
运用[古法煎饼果子配方]制作煎饼果子
运用[独创煎饼果子配方]制作煎饼果子
"""

方式一:make_master_cake()方法中的代码冗余;父类类名如果变化,那么在子类中会涉及多处修改,另外,Python是允许多继承的语言,如上所示的方法在多继承时就需要重复写多次,显得累赘。为了解决这些问题,Python提供了super()函数解决此问题。

方式二

使用super()函数调用父类中的同名方法。

# 1.创建师父类,属性和方法
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]' def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子') # 2. 定义徒弟类,继承师父类
# 添加和父类同名的属性和方法
class Prentice(Master):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]' # 子类的make_cake(self)方法
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子') # 调用父类的make_cake()方法
# 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
# 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化
def make_master_cake(self):
# 方法二: super()
# super函数需要传递的参数:(当前类名, self)前边是类名,后边是对象
# 方式一: super(当前类名, self).函数()
# super(Prentice, self).__init__()
# super(Prentice, self).make_cake() # 方式二; 简便方法,使用super().函数(),参数可省略。
super().__init__()
super().make_cake() # 3 . 用徒弟类创建对象,调用实例属性和方法
# 创建一个子类对象
tudi = Prentice() # 调用执行父类中的make_cake()方法
tudi.make_master_cake() # 调用子类中的make_cake()
tudi.make_cake() """
输出结果:
运用[古法煎饼果子配方]制作煎饼果子
运用[独创煎饼果子配方]制作煎饼果子
"""

注意:使用super()函数可以自动查找父类。调用顺序遵循 __mro__ 类属性的顺序。比较适合单继承使用。

__mro__内置类属性说明

在Python中快速查看一个类的所继承的父类,以及父类的层级关系的方法,返回的结果是一个元组。

# 如上边示例
# 语法:类名.__mro__
print(Prentice.__mro__) """
输出结果:
(<class '__main__.Prentice'>, <class '__main__.Master'>, <class 'object'>) 可以看到返回的是一个元组,
`super()`函数在这个元组的类中,依次查找相关属性或方法。
"""

『无为则无心』Python面向对象 — 54、重写和super()函数的更多相关文章

  1. 『无为则无心』Python面向对象 — 46、类和对象

    目录 1.理解类和对象 2.类 3.对象 4.Python中的对象 5.类和对象的定义 (1)定义类 (2)创建对象 (3)练习 6.拓展:isinstance() 函数 1.理解类和对象 (1)类和 ...

  2. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  3. 『无为则无心』Python面向对象 — 53、对Python中封装的介绍

    目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...

  4. 『无为则无心』Python面向对象 — 45、面向对象编程

    目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...

  5. 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)

    Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...

  6. 『无为则无心』Python面向对象 — 56、Python多态

    目录 1.Python中的多态 (1)多态的定义 (2)多态的好处 (3)多态实现步骤 2.体验多态 1.Python中的多态 (1)多态的定义 多态是一种使用对象的方式,子类重写父类方法,不同的子类 ...

  7. 『无为则无心』Python面向对象 — 47、Python中的self详解

    目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...

  8. 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员

    目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...

  9. 『无为则无心』Python面向对象 — 58、类方法和静态方法

    目录 1.实例方法 2.类方法 (1)类方法特点 (2)类方法使用场景 3.静态方法 (1)静态方法特点 (2)静态方法使用场景 1.实例方法 实例方法既可以调用静态方法也可以调用类方法. # 定义一 ...

随机推荐

  1. 单篇长文TestNG从入门到精通

    简介 TestNG是Test Next Generation的缩写,它的灵感来自于JUnit和NUnit,在它们基础上增加了很多很牛的功能,比如说: 注解. 多线程,比如所有方法都在各自线程中,一个测 ...

  2. 微服务架构 | 3.3 Apache Zookeeper 注册中心

    @ 目录 前言 1. Zookeeper 基础知识 1.1 Zookeeper 是什么 1.2 Zookeeper 的数据结构 1.3 Watcher 机制 1.4 常见应用场景分析 1.5 Zook ...

  3. 自从学会了VBA字典,VLOOKUP都不那么香了

    上篇博文中,小爬曾多次为VBA字典带货.鼓励多用字典,可以让我们的VBA脚本工具执行更快.今天小爬来细聊一下VBA字典的具体应用!如果你有一定VBA基础,那么看完你一定会对VBA字典有全新的认识:如果 ...

  4. C#进阶——记一次USB HID的各种坑(x86,x64,win10,win7)

    一.简叙 写工控上位机的搬砖人,难免会遇到USB通讯,在一个项目中,我写的上位机使用USB HID协议和STM32通讯传输数据,从零大概花了几天找例程,找资料,最后是各种搬砖修补,终于出来了一个出版D ...

  5. C#语言类型

    讨论 所有类型在,值类型,引用类型用new创建,值类型由编译器自动补全 int等引用类型是轻量化结构更像是结构体 值类型在栈中,引用类型在堆中 所有类型由类派生,可以说每个是对象,也可以不是 由于.N ...

  6. .Net Core中自定义认证实现

    一.起因 最近项目中需要对项目同时支持JWT认证,以及自定义的认证校验方式认证.通过对官方文档了解,得到认证实现主要通过继承IAuthenticationHandler 或 Authenticatio ...

  7. Docker 实操

    ---恢复内容开始--- 一.简介 Linux容器作为一类操作系统层面的虚拟化技术成果,旨在立足于单一Linux主机交付多套隔离性Linux环境.与虚拟机不同,容器系统并不需要运行特定的访客操作系统. ...

  8. python 小兵内置函数进制转换

    Python内置函数进制转换的用法 使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Conve ...

  9. WebAssembly编译

    环境:centos 7.9 1.准备环境 sudo yum install docker sudo systemctl start docker.service sudo docker pull tr ...

  10. Understanding C++ Modules In C++20 (2)

    Compiling evironment: linux (ubuntu 16.04)+ gcc-10.2. The post will focus on using export,import,vis ...