文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python的super函数详解

2023-09-26 21:03

关注

python基础知识

用于类继承的super函数介绍

目录

python基础知识

一、super函数的用途

二、了解super函数的基本信息

三、多继承不重复调用

 四、多继承重复调用

总结


一、super函数的用途

(1)避免在改动父类名称时还需改动子类调用方法的代码

(2)在子类中按照一套内置的顺序自动调用父类的方法

(3)多用于多继承问题中,解决查找顺序(MRO)、重复调用(钻石继承)等种种问题

二、了解super函数的基本信息

super([type[, object-or-type]])

函数说明:

        返回一个代理对象,它会将方法调用委托给 type 的父类或兄弟类。

参数说明 :

        type:类,可选参数;

        object-or-type:对象或类,一般是self,也是可选参数;

参数作用:第二个参数决定了调用父类的顺序,比如self,就是调用super函数的对象本身,它有一个__mro__属性,决定了按什么顺序调用父类的方法;第一个参数决定了从哪个类开始调用,一般也可以是本身类,即从本身这个类的顺序中的下一个类开始调用该方法

注:但要注意调用该方法的从始至终都是self对象,而不是父类对象

三、多继承不重复调用

这里我们就直接从多继承开始,明白了多继承super函数的使用,单继承自然也就不在话下。

代码如下:

class A:    def __init__(self):        print("找到 funxx() 位于 A 中...")class B(A):    def __init__(self):        print("找到 funxx() 位于 B 中...")class C(A):    def __init__(self):        print("找到 funxx() 位于 C 中...")    passclass D(A):    def __init__(self):        print("找到 funxx() 位于 D 中...")class E(B, C):    def __init__(self):        print("找到funcxx()位于E中...")class F(E, D):    def __init__(self):        print("执行 F 中的 funff()...")        super(F, self).__init__()print(f"F 类的 MRO : {F.__mro__}")#获取得到F类的__mro__属性,从而知道其调用父类的顺序f = F()

输出如下:

F 类的 MRO : (, , , , , , )执行 F 中的 funff()...找到funcxx()位于E中...

(1)通过__mro__属性得到F类调用其父类的顺序;即输出的第一行,按照F->E->B->C->D->A类的顺序调用其__init__方法

(2)我们看到super函数内的第二个参数为self对象,所以其按照上述顺序进行调用父类方法;第一个参数为F,即F类,所以我们从F往下开始调用父类方法,这里也就是E类的方法

再次实践(这次我们将super函数的第一个参数改为B):

class A:    def __init__(self):        print("找到 funxx() 位于 A 中...")class B(A):    def __init__(self):        print("找到 funxx() 位于 B 中...")class C(A):    def __init__(self):        print("找到 funxx() 位于 C 中...")    passclass D(A):    def __init__(self):        print("找到 funxx() 位于 D 中...")class E(B, C):    def __init__(self):        print("找到funcxx()位于E中...")class F(E, D):    def __init__(self):        print("执行 F 中的 funff()...")        super(B, self).__init__()print(f"F 类的 MRO : {F.__mro__}")#获取得到F类的__mro__属性,从而知道其调用父类的顺序f = F()

显然就应该调用该顺序中B类的下一个类C类的方法;输出如下:

F 类的 MRO : (, , , , , , )执行 F 中的 funff()...找到 funxx() 位于 C 中...

 四、多继承重复调用

先看调用父类方法的普通使用:直接用类名.方法即可;但是在父类名字变化时还得回到子类去做相应修改,很麻烦

class A:    def __init__(self):        print("打印属性 a")class B(A):    def __init__(self):        print("打印属性 b")        A.__init__(self)  # super() 等同于 super(B, self)class C(A):    def __init__(self):        print("打印属性 c")        A.__init__(self)  # super() 等同于 super(C, self)class D(B, C):    def __init__(self):        print("打印属性 d")        B.__init__(self)        C.__init__(self)d = D()#以下为输出结果打印属性 d打印属性 b打印属性 a打印属性 c打印属性 a

可以看到A的构造函数重复调用了两次,造成资源浪费

再来看看使用super函数进行调用父类的方法

class A:    def __init__(self):        print("打印属性 a")#class B(A):    def __init__(self):        print("打印属性 b")        super().__init__()  # super() 等同于 super(B, self)class C(A):    def __init__(self):        print("打印属性 c")        super().__init__()  # super() 等同于 super(C, self)class D(B, C):    def __init__(self):        print("打印属性 d")        super(D, self).__init__()d = D()#输出结果打印属性 d打印属性 b打印属性 c打印属性 a

(1)强调一下:这里的super()没有参数,就默认都采用了本身类;比如A中的super()相当于super(A,self)

(2)在讲解一下整个程序的运行过程:初始化d对象,打印“打印属性 d”;然后super函数运行,调用了D类的__init__方法,但是这个self是d对象,所以这个顺序一直都是d对象的__mro__属性;打印“打印属性 b”;再调用super函数,按照d对象给出的顺序,下一个是C类的__init__方法,打印“打印属性 c”;继续调用super函数,最后才是A类的__init__方法,打印“打印属性 a”。


总结

以上就是关于super函数的使用讲解,谢谢大家;其中的代码来自(144条消息) Python super( ) 函数详解_小皇鱼的博客-CSDN博客_python super();但是讲解还是自己一个字一个字敲的。

来源地址:https://blog.csdn.net/m0_58357681/article/details/128605941

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯