文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python super( )函数用法总结

2022-06-02 22:32

关注
目录

一、super( ) 的用途

了解 super() 函数之前,我们首先要知道 super() 的用途是啥?

二、了解 super 的基础信息

语法格式:


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

函数描述:

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

参数说明:

type —— 类,可选参数。object-or-type —— 对象或类,一般是 self,可选参数。

返回值:

super object —— 代理对象。

help 帮助信息:


>>> help(super)
Help on class super in module builtins:
 
class super(object)
 |  super() -> same as super(__class__, <first argument>)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |          super().meth(arg)
 |  This works for class methods too:
 |  class C(B):
 |      @classmethod
 |      def cmeth(cls, arg):
 |          super().cmeth(arg)
 
... ...

三、典型用法

3.1 单继承问题

首先我们看一个最基本的子类调用父类方法的示例:


>>> class A:
        def funxx(self):
            print("执行 A 中的 funxx 方法 ... ...")
 
        
>>> class B(A):
        def funxx(self):
            A.funxx(self)       # 通过类名调用父类中的同名方法,self 参数代表 B 类的实例对象 b
            print("执行 B 中的 funxx 方法 ... ...")
 
        
>>> b = B()
>>> b.funxx()
执行 A 中的 funxx 方法 ... ...
执行 B 中的 funxx 方法 ... ...

使用 super() 函数来实现父类方法的调用:


>>> class A:
        def funxx(self):
            print("执行 A 中的 funxx 方法 ... ...")
 
        
>>> class B(A):
        def funxx(self):
            super().funxx()
            print("执行 B 中的 funxx 方法 ... ...")
 
		
>>> b = B()
>>> b.funxx()
执行 A 中的 funxx 方法 ... ...
执行 B 中的 funxx 方法 ... ...

3.2 单继承问题拓展

help() 的帮助信息中,也说明了类中使用 super() 不带参数的形式等同于 super(__class__, <first argument>) 这种形式。这也是 Python 2.x 和 Python 3.x 关于 super() 的区别。

改写之前的单继承问题的代码:


>>> class A:
        def funxx(self):
            print("执行 A 中的 funxx 方法 ... ...")
 
		
>>> class B(A):
        def funxx(self):
	        super(B, self).funxx()
	        print("执行 B 中的 funxx 方法 ... ...")
 
		
>>> b = B()
>>> b.funxx()
执行 A 中的 funxx 方法 ... ...
执行 B 中的 funxx 方法 ... ...

示例:


class A:
    pass
 
 
class B(A):
    pass
 
 
class C(A):
    def funxx(self):
        print("找到 funxx() 位于 C 中...")
 
 
class D(A):
    pass
 
 
class E(B, C):
    pass
 
 
class F(E, D):
    def funff(self):
        print("执行 F 中的 funff()...")
        super(E, self).funxx()
 
        
print(f"F 类的 MRO : {F.__mro__}")
f = F()
f.funff()

运行结果:


F 类的 MRO : (<class '__main__.F'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
执行 F 中的 funff()...
找到 funxx() 位于 C 中...

3.3 重复调用问题

重复调用问题 也称 钻石继承问题 或 菱形图问题。

先来看看普通调用方法在:


>>> class A:
        def __init__(self):
            print("打印属性 a")
 
	    
>>> class B(A):
        def __init__(self):
            print("打印属性 b")
            A.__init__(self)
 
	    
>>> class C(A):
        def __init__(self):
            print("打印属性 c")
            A.__init__(self)
 
	    
>>> class D(B, C):
        def __init__(self):
            print("打印属性 d")
            B.__init__(self)
            C.__init__(self)
 
	    
>>> d = D()
打印属性 d
打印属性 b
打印属性 a
打印属性 c
打印属性 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

3.4 super(type) 问题


>>> class A:
	    def funxx(self):
		    print("...A...")
 
		
>>> class B(A):
	    def funxx(self):
		    print("...B...")
 
		
>>> sa = super(B)
>>> print(sa)
<super: <class 'B'>, NULL>
>>> print(type(sa))
<class 'super'>

可以看出 super(type) 返回的是一个无效的对象,或者是未绑定的 super object。

到此这篇关于Python super( )函数用法总结的文章就介绍到这了,更多相关super( )函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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