第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章相关推荐

  1. 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记

    本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5 ...

  2. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:12 安装指导

    12 安装指导 12.1 安装Python.pip和NLTK 12.2 安装PyCharm开发环境 12.3 安装依赖库 12.4 框架安装指导 12.5 解决你的疑问 12.6 总结 本附录为您提供 ...

  3. python画聚类树状图_影像组学学习笔记(36)-聚类树状图Dendrogram的python实现

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(36)主要介绍: 聚类树状图Dendrogram的python实现 应该注意一下scipy版本的问题:scipy 1.5.0版本画聚类树 ...

  4. HTML5 权威指南第 10 章 文档分节 学习笔记

    HTML5 权威指南第 10 章 文档分节 学习笔记 第 8 章 标记文字 内容从从文字出发,专注如何将单体内容正确的呈现出来:第 9 章 组织内容 内容从段落出发,专注如何将单体内容合理的放在段落中 ...

  5. Python 基础课程第十一天

    Python 基础课程第十一天 第七章模块(module) 1. 模块化(module)程序设计理念 1.1 模块和包概念的进化史 1.2 标准库模块(standard library) 1.3 为什 ...

  6. Python 基础课程第八天

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Python 基础课程第八天 第6 章(1) 面向对象初步 方法没有重载 方法的动态性 私有属性和私有方法(实现封装) @proper ...

  7. Python 基础课程第五天

    Python 基础课程第五天 第四章:控制语句 循环结构 for循环和可迭代对象遍历 可迭代对象 range 对象 嵌套循环和综合练习 break 语句 continue 语句 else 语句 循环代 ...

  8. python 基础课程第三天

    文章目录 python 基础课程第三天 字符串 可变字符串 基本运算符 复合赋值运算符 运算符优先级 序列 列表简介 列表的创建 基本语法[]创建 list()创建 range()创建整数列表 推导式 ...

  9. python 基础课程第二天

    文章目录 python 基础课程第二天 链式赋值 系列解包赋值 常量 最基本内置数据类型介绍 数字和基本运算符 整数 使用INT()实现类型转换: 自动转型: 整数可以多大 浮点数 类型转换和四舍五入 ...

最新文章

  1. Virtual ListView效率对比
  2. Django 02 url路由配置及渲染方式
  3. android平板交互,安卓平板就应该如此,华为MatePad Pro 交互体验
  4. Android 为应用添加默认加载页
  5. android 运行jquery,Android端JQueryMobile使用教程(一)
  6. git保存账号密码_Altium Designer 通过Git实现版本控制
  7. c语言学习-自定义函数并调用求1-100的累计和
  8. jq中使用promise封装ajax
  9. 第三:GitHub的使用(超详细)
  10. MyEclipse 10.5与ExtJS 4.1.1自动代码提示
  11. ssim算法计算图片_OpenCV 实现图像结构相似度算法 (SSIM 算法)
  12. 计算机三种桌面图标,例举win7电脑桌面图标排列方式
  13. 科学记忆单词---麦克米伦
  14. python对英语的要求_对英文【对英文英语头条】- 对英文知识点 - 中企动力
  15. 说话人识别(speaker Recognition/Verification)简介
  16. 亚马逊如何创业?身为小白的我适合创业亚马逊吗
  17. 会员营销如何提升企业与会员之间的互动频率
  18. css设置背景图片随滚动缓慢滚动_h5页面背景图很长要有滚动条滑动效果的实现...
  19. 无人机三维建模(3) 航拍实景模型
  20. 洛谷 P1085 不高兴的津津 C语言

热门文章

  1. Android:浏览器跳转
  2. 北京化工大学计算机专业就业,北京化工大学特色专业介绍_计算机科学与技术_专业课程介绍_专业排名_就业方向...
  3. sql join中能否使用case when_SQL(五)——多表查询
  4. git只提交一张图片_即使只使用一张静止的图片,也能制作出带有动感天空的视频...
  5. 认识与入门 Markdown
  6. Direct3D9 Fx/HLSL的若干条有用的笔记
  7. UE4与WEB服务器交互(json)
  8. TensorFlow-RNN循环神经网络 Example 2:文本情感分析
  9. 更新一波,微信第三方开发平台授权流程
  10. Vue.js - Day2