python基础课程第12章_流畅的python学习笔记-第12章
第12章-类继承
super函数
Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承。
Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 super(Class, self)。
那么 super() 到底是依据什么来继承的呢?
super()函数根据传进去的两个参数具体作用如下:
通过第一参数传进去的类名确定当前在MRO中的哪个位置。MRO(Method Resolution Order)
通过第二个参数传进去的self,确定当前的MRO列表。
class A(object):
def name(self):
print('name is xiaoming')
# super(A, self).name()
class B(object):
def name(self):
print('name is cat')
class C(A, B):
def name(self):
print('name is wang')
super(C, self).name()
if __name__ == '__main__':
c = C()
print(c.__class__.__mro__)
c.name()
返回结果是:
(, , , )
name is wang
name is xiaoming
如果把注释去掉的结果是:
(, , , )
name is wang
name is xiaoming
name is cat
再看一个例子:
class Base(object):
def func_1(self):
print('this is base')
class A(Base):
def func_1(self):
super().func_1()
print('this is A')
class B(Base):
def func_1(self):
super().func_1()
print('this is B')
class C(A, B):
def func_1(self):
super().func_1()
print('this is c')
print(C.mro())
C().func_1()
print(help(C))
返回结果:
Help on class C in module __main__:
class C(A, B)
| Method resolution order:
| C
| A
| B
“从左到到右”的意思,C继承关系最近的是A, 然后是B,最后是上层BASE。
调用方法时的入栈顺序是 C A B Base,
出栈顺序是Base B A C,
class Base(object):
def __init__(self):
print("Base created")
class ChildA(Base):
def __init__(self):
Base.__init__(self)
class ChildB(Base):
def __init__(self):
# super(ChildB, self).__init__()
# 或者更简单的写法
# super().__init__()
# 如果不用super写法就要这样写
print("self=", self) # <__main__.childb object at>
mro = type(self).mro()
print(mro)
# [, , ]
for next_class in mro[mro.index(ChildB) + 1:]:
print(next_class) #
if hasattr(next_class, '__init__'):
next_class.__init__(self)
break
print(ChildA())
print("#" * 10)
print(ChildB())
问题
看下面的代码:
class Base(object):
def __init__(self):
print("Base created")
class ChildA(Base):
def __init__(self):
print("ChildA init...")
Base.__init__(self)
class ChildB(Base):
def __init__(self):
print("ChildB init..")
# super(ChildB, self).__init__()
# 或者更简单的写法
super().__init__()
if __name__ == "__main__":
print(ChildA())
print("#" * 10)
print(ChildB())
返回值:
ChildA init...
Base created
##########
ChildB init..
Base created
可以看到结果是一样的,那么 Base.__init__(self) 和 super().__init__()
有什么区别呢?
请看这个例子:
class Base(object):
def __init__(self):
print("Base created")
class UserDependency(Base):
def __init__(self):
print("UserDependency init...")
super().__init__()
class ChildA(Base):
def __init__(self):
print("ChildA init...")
Base.__init__(self)
class ChildB(Base):
def __init__(self):
print("ChildB init..")
# super(ChildB, self).__init__()
# 或者更简单的写法
super().__init__()
class UserA(ChildA, UserDependency):
def __init__(self):
print("UserA init...")
super(UserA, self).__init__()
class UserB(ChildB, UserDependency):
def __init__(self):
print("UserB init...")
super(UserB, self).__init__()
if __name__ == "__main__":
print(UserA())
print("#" * 10)
print(UserB())
返回结果:
UserA init...
ChildA init...
Base created
##########
UserB init...
ChildB init..
UserDependency init...
Base created
这里我们看到了区别,在多重继承中,没有使用super方法的类,没有调用UserDenpendency方法
python基础课程第12章_流畅的python学习笔记-第12章相关推荐
- 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记
本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5 ...
- 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:12 安装指导
12 安装指导 12.1 安装Python.pip和NLTK 12.2 安装PyCharm开发环境 12.3 安装依赖库 12.4 框架安装指导 12.5 解决你的疑问 12.6 总结 本附录为您提供 ...
- python画聚类树状图_影像组学学习笔记(36)-聚类树状图Dendrogram的python实现
本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(36)主要介绍: 聚类树状图Dendrogram的python实现 应该注意一下scipy版本的问题:scipy 1.5.0版本画聚类树 ...
- HTML5 权威指南第 10 章 文档分节 学习笔记
HTML5 权威指南第 10 章 文档分节 学习笔记 第 8 章 标记文字 内容从从文字出发,专注如何将单体内容正确的呈现出来:第 9 章 组织内容 内容从段落出发,专注如何将单体内容合理的放在段落中 ...
- Python 基础课程第十一天
Python 基础课程第十一天 第七章模块(module) 1. 模块化(module)程序设计理念 1.1 模块和包概念的进化史 1.2 标准库模块(standard library) 1.3 为什 ...
- Python 基础课程第八天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Python 基础课程第八天 第6 章(1) 面向对象初步 方法没有重载 方法的动态性 私有属性和私有方法(实现封装) @proper ...
- Python 基础课程第五天
Python 基础课程第五天 第四章:控制语句 循环结构 for循环和可迭代对象遍历 可迭代对象 range 对象 嵌套循环和综合练习 break 语句 continue 语句 else 语句 循环代 ...
- python 基础课程第三天
文章目录 python 基础课程第三天 字符串 可变字符串 基本运算符 复合赋值运算符 运算符优先级 序列 列表简介 列表的创建 基本语法[]创建 list()创建 range()创建整数列表 推导式 ...
- python 基础课程第二天
文章目录 python 基础课程第二天 链式赋值 系列解包赋值 常量 最基本内置数据类型介绍 数字和基本运算符 整数 使用INT()实现类型转换: 自动转型: 整数可以多大 浮点数 类型转换和四舍五入 ...
最新文章
- Virtual ListView效率对比
- Django 02 url路由配置及渲染方式
- android平板交互,安卓平板就应该如此,华为MatePad Pro 交互体验
- Android 为应用添加默认加载页
- android 运行jquery,Android端JQueryMobile使用教程(一)
- git保存账号密码_Altium Designer 通过Git实现版本控制
- c语言学习-自定义函数并调用求1-100的累计和
- jq中使用promise封装ajax
- 第三:GitHub的使用(超详细)
- MyEclipse 10.5与ExtJS 4.1.1自动代码提示
- ssim算法计算图片_OpenCV 实现图像结构相似度算法 (SSIM 算法)
- 计算机三种桌面图标,例举win7电脑桌面图标排列方式
- 科学记忆单词---麦克米伦
- python对英语的要求_对英文【对英文英语头条】- 对英文知识点 - 中企动力
- 说话人识别(speaker Recognition/Verification)简介
- 亚马逊如何创业?身为小白的我适合创业亚马逊吗
- 会员营销如何提升企业与会员之间的互动频率
- css设置背景图片随滚动缓慢滚动_h5页面背景图很长要有滚动条滑动效果的实现...
- 无人机三维建模(3) 航拍实景模型
- 洛谷 P1085	不高兴的津津 C语言
热门文章
- Android:浏览器跳转
- 北京化工大学计算机专业就业,北京化工大学特色专业介绍_计算机科学与技术_专业课程介绍_专业排名_就业方向...
- sql join中能否使用case when_SQL(五)——多表查询
- git只提交一张图片_即使只使用一张静止的图片,也能制作出带有动感天空的视频...
- 认识与入门 Markdown
- Direct3D9 Fx/HLSL的若干条有用的笔记
- UE4与WEB服务器交互(json)
- TensorFlow-RNN循环神经网络 Example 2:文本情感分析
- 更新一波,微信第三方开发平台授权流程
- Vue.js - Day2