• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python super( )函数用法总结

    一、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( )函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python中super()函数简介及用法分享
    • Python中super函数的用法
    • Python编程中对super函数的正确理解和用法解析
    • 解决python super()调用多重继承函数的问题
    • 对Python3之方法的覆盖与super函数详解
    • Python super()函数使用及多重继承
    • python super函数使用方法详解
    • python super()函数的基本使用
    • Python中super函数用法实例分析
    • python中super()函数的理解与基本使用
    上一篇:matplotlib如何设置坐标轴刻度的个数及标签的方法总结
    下一篇:OpenCV-Python实现图像梯度与Sobel滤波器
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python super( )函数用法总结 Python,super,函数,用法,总结,