当前位置: 首页 > news >正文

python深坑集锦 -- super

一、前言

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)
复制代码

 

夜深了,暂时会这么多就写这么多,有空研究c3原理(挖个坑先)

 

 

 来源:

https://www.cnblogs.com/xinghuaikang/p/8481712.html

转载于:https://www.cnblogs.com/hansha/p/9713591.html

相关文章:

  • 反客为主 ,Linux 成为微软 Azure 上最流行的操作系统
  • Linux下面如何运行.sh文件
  • windows下 python中报错ImportError: No module named 'requests'
  • SDUT-3331_数据结构实验之链表八:Farey序列
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • 国内pip
  • citus实战系列之三平滑扩容
  • ET的Actor应用的场景
  • Vue.js学习(一)
  • 20180925-3 效能分析
  • 网络知识
  • [Android] Implementation vs API dependency
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • linux安装LNMP环境之安装MySQL
  • 11111111
  • CentOS从零开始部署Nodejs项目
  • css的样式优先级
  • css系列之关于字体的事
  • Linux Process Manage
  • nginx 负载服务器优化
  • Python3爬取英雄联盟英雄皮肤大图
  • Spring Cloud中负载均衡器概览
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Terraform入门 - 3. 变更基础设施
  • VUE es6技巧写法(持续更新中~~~)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 入手阿里云新服务器的部署NODE
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 1.Ext JS 建立web开发工程
  • MyCAT水平分库
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (ibm)Java 语言的 XPath API
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)SpringBoot3---尚硅谷总结
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)c++ std::pair 与 std::make
  • .net core 6 集成和使用 mongodb
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NetCore 如何动态路由
  • .Net环境下的缓存技术介绍
  • @RequestBody的使用
  • []我的函数库
  • [C++]指针与结构体
  • [CF494C]Helping People
  • [codevs] 1029 遍历问题
  • [CSS]CSS 字体属性
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [na]wireshark抓包排错-tcp.flags.reset