一、前言

Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了。特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸)

二、代码

直接上干货,能把下面一个问题全答对,后面就不用看了。

class A():

def go(self):

print ("go A go!")

def stop(self):

print ("stop A stop!")

def pause(self):

raise Exception("Not Implemented")

class B(A):

def go(self):

super(B, self).go()

print ("go B go!")

class C(A):

def go(self):

super(C, self).go()

print ("go C go!")

def stop(self):

super(C, self).stop()

print ("stop C stop!")

class D(B,C):

def go(self):

super(D, self).go()

print ("go D go!")

def stop(self):

super(D, self).stop()

print ("stop D stop!")

def pause(self):

print ("wait D wait!")

class E(B,C):

pass

a = A()

b = B()

c = C()

d = D()

e = E()

# 说明下列代码的输出结果

a.go()

print('--------')

b.go()

print('--------')

c.go()

print('--------')

d.go()

print('--------')

e.go()

print('--------')

a.stop()

print('--------')

b.stop()

print('--------')

c.stop()

print('--------')

d.stop()

print('--------')

e.stop()

print(D.mro())

a.pause()

b.pause()

c.pause()

d.pause()

e.pause()

当然,直接运行就有答案了,还是要仔细想一下,反正看到我第一次跑出的结果的时候,我都不敢相信自己的眼睛。

step1:

几个概念:

继承的功能:父类的代码重用

多态的功能:同一方法对不同类型的对象会有相应的结果

开闭原则:对扩展开放,对修改封闭

super类功能:新式类实现广度优先的不重复的调用父类,解决了钻石继承(多继承)的难题

step2:

super实现原理:通过c3算法,生成mro(method resolution order)列表,根据列表中元素顺序查询调用

新式类调用顺序为广度优先,旧式类为深度优先

step3:

个人理解:

1.调用了父类的方法,出入的是子类的实例对象

2.新式类子类(A,B),A就在B之前

3.super类似于嵌套的一种设计,当代码执行到super实例化后,先去找同级父类,若没有其余父类,再执行自身父类,再往下走,

简洁点的三个原则就是:

子类在父类前,所有类不重复调用,从左到右

理解了以上的说法,题目就没问题了。

也不用跑了,答案如下:

a.go()# go A go!

b.go()# go A go!# go B go!

c.go()# go A go!# go C go!

d.go()# go A go!# go C go!# go B go!# go D go!

e.go()# go A go!# go C go!# go B go!

a.stop()# stop A stop!

b.stop()# stop A stop!

c.stop()# stop A stop!# stop C stop!

d.stop()# stop A stop!# stop C stop!# stop D stop!

e.stop()# stop A stop!

a.pause()# ... Exception: Not Implemented

b.pause()# ... Exception: Not Implemented

c.pause()# ... Exception: Not Implemented

d.pause()# wait D wait!

e.pause()# ...Exception: Not Implemented

看了答案,其实还有一点,父类抛异常的情况,如果子类有不抛异常的方法,异常就不抛出了,这个设计也会很有用。

这里就中间一个A,C,B,D的和网上常见的不太一样,促使我仔细研究了一下,其实就是个人理解第三条。

补充:

Python2 和Python3在这个问题上的差别

Python2 没有默认继承object

Python3 默认全部继承object类,都是新式类

Python2super调用 super(开始类名,self).函数名()

Python3 super().函数名()

关于调用父类函数传入子类实例的栗子举一个:

class A:

def __init__(self):

self.n = 2

def add(self, m):

print('self is {0} @A.add'.format(self))

self.n += m

class B(A):

def __init__(self):

self.n = 3

def add(self, m):

print('self is {0} @B.add'.format(self))

super().add(m)

print('newb')

self.n += 3

class C(A):

def __init__(self):

self.n = 4

def add(self, m):

print('self is {0} @C.add'.format(self))

super().add(m)

print('newc')

self.n += 4

class D(B, C):

def __init__(self):

self.n = 5

def add(self, m):

print('self is {0} @D.add'.format(self))

super().add(m)

self.n += 5

d = D()

d.add(2)

print(d.n)

总结

以上所述是小编给大家介绍的Python 关于supper 的 用法和原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

pythond的执行原理_深入理解Python 关于supper 的 用法和原理相关推荐

  1. python画爱心原理_如何理解python一行代码实现一个爱心字符画?

    前言 python中有个很酷的效果,一行代码实现一个爱心字符,虽说是一行代码,但是理解起来还是比较难的,括号太多,并且使用了python的一些快捷小技巧.比如三元表达式,列表生成式,字符串拼接以及一个 ...

  2. python异步回调实现原理_快速理解Python异步编程的基本原理

    第一个例子 假设你需要用电饭煲煮饭,用洗衣机洗衣服,给朋友打电话让他过来吃饭.其中,电饭煲需要30分钟才能把饭煮好,洗衣机需要40分钟才能把衣服洗好,朋友需要50分钟才能到你家.那么,是不是你需要在这 ...

  3. python sorted原理_深入理解Python的sorted

    1. 简介 sorted的派排序功能真强大,从前一直使用C++.Java以为其功能很强大了,但与Python一比,真的要差一些. 2. 函数定义 sorted(iterable, cmp=None, ...

  4. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  5. 如何用python写数值运算_如何理解Python的数值运算?

    1 基本算术运算 1.1 使用规则 – Python解析器相当于一个简单的计算器 – Python解析器可以接受简单的算术表达式 – 运算符可以使加(+)减(-)乘(*)除(/) 1.2 实操理解 # ...

  6. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  7. python super()方法的作用_详解python的super()的作用和原理

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递.uz0免费资源网 今天我们介绍的主角是s ...

  8. python语句解释_深入理解python with 语句

    深入理解python with 语句 python中with 语句作为try/finally 编码范式的一种替代, 适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的" ...

  9. python属性_深入理解python对象及属性

    类属性和实例属性 首先来看看类属性和类实例的属性在python中如何存储,通过__dir__方法来查看对象的属性 >>> class Test(object): pass >& ...

最新文章

  1. RequireJS入门(一) 转
  2. 基于百度AI+jquery-webcam+servlet实现人脸识别登录,兼容各主流浏览器
  3. Git的使用_思维导图
  4. 《面向对象分析与设计》一1.4面向对象方法的主要优点
  5. SDN第四次上机作业
  6. javascript基础:Math对象
  7. 支持多浏览器的js拖拽 (转domkey0303 的blog)
  8. anaconda各个版本下载资源
  9. 一分钟实现扫描二维码功能
  10. 【神经网络】激活函数的作用及常用激活函数
  11. opencv-6 边缘检测(Prewitt算子,Sobel算子,Laplacian算子)
  12. OneNote for win10 登录不了
  13. 学硕计算机可考大数据博士吗,专硕考博比学硕考博难度更大吗?听听上岸的人怎么说...
  14. 基础-02-日语单词的词性与分类
  15. 好物推荐:眼科OCT影像自动分割工具推荐
  16. python3 pdf下载无加密_如何实现使用python将pdf文档加密?
  17. 《蜘蛛侠3》5月2日中国提前上映
  18. Transact-SQL语言基础语句
  19. 线缆束的辐射与抗干扰
  20. react 中的闭包陷阱

热门文章

  1. 读《一个人的朝圣》| 沾染上称为信仰的东西,都会不一样
  2. Mybatis分页插件配置
  3. web学习入门资源总结
  4. 刘慈欣,王晋康,何夕著《星际远征》
  5. 五金机械行业网站建设方案
  6. 如何分辨及举报钓鱼网站/诈骗网站
  7. FreeEIM 全排列算法原理和实现
  8. tomcat使用详解(week4_day2)--技术流ken
  9. unity2022打开项目时报Fatal error显示无权访问d3dcompiler_47.dll, 解决方法很简单-还有ucrtbase.dll问题
  10. 半导体芯片产业无尘车间激光尘埃粒子计数器