`
rockkyle
  • 浏览: 10804 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

super 总结

 
阅读更多

一、在Python类的方法(method)中,要调用父类的某个方法,可以有如下写法

class A(object):
        def __init__(self):
                print "enter A"
                print "leave A"
class B(A):
        def __init__(self):
                print "enter B"
                A.__init__(self)
                print "leave B"

b=B()

 结果

enter B
enter A
leave A
leave B

 如果B的父类改变为C,如上例子只需要修改2处而已(将B类中的A换成C),这种调用方法在代码量大的情况下不可取,即引入super机制

官网解释super(type[, object-or-type]):

返回type的父类,如果第二个参数遗漏,则父类是非绑定的,如果第二个参数为object,则isinstance(obj,type)需为真,如果第二个参数为type,则issubclass(type2,type)需为真,super()必须作用于新式类。

 

改写如下(绑定),其中self是B的一个实例:

class A(object):
        def __init__(self):
                print "enter A"
                print "leave A"
class B(A):
        def __init__(self):
                print "enter B"
                super(B,self).__init__()
                print "leave B"

b=B()
二、多重继承情况:
非绑定情况
class A(object):
        def __init__(self):
                print "enter A"
                print "leave A"
class B(A):
        def __init__(self):
                print "enter B"
                A.__init__(self)
                print "leave B"
class C(B,A):
        def __init__(self):
                print "enter C"
                B.__init__(self)
                A.__init__(self)
                print "leave C"
c=C()
 
enter C
enter B
enter A
leave A
leave B
enter A
leave A
leave C
 看出A被调了2次,改用super,
class A(object):
        def __init__(self):
                print "enter A"
                print "leave A"
class B(A):
        def __init__(self):
                print "enter B"
                super(B,self).__init__()
                print "leave B"
class C(B,A):
        def __init__(self):
                print "enter C"
                super(C,self).__init__()
                print "leave C"
c=C()
 结果:
enter C
enter B
enter A
leave A
leave B
leave C
 这里只被调用一次
三、多重继承机制
python super多重继承机制为mro(Method resolution order)
比如上面的例子MRO即为 C B A ,super调用的为MRO中的下一个方法
class A(object):
  2     def __init__(self):
  3         print "A"
  4         super(A,self).__init__()
  5 class B(object):
  6     def __init__(self):
  7         print "B"
  8         super(B,self).__init__()
  9 class C(A):
 10     def __init__(self,arg):
 11         print "c","arg=",arg
 12         super(C,self).__init__()
 13 class D(B):
 14     def __init__(self,arg):
 15         print "D","arg=",arg
 16         super(D,self).__init__()
 17 
 18 class E(C,D):
 19     def __init__(self,arg):
 20         print "E","arg=",arg
 21         super(E,self).__init__(arg)
 22 E(1)
 期望输出:
E arg=1
C arg=1
A
D arg=1
E
实际输出
E arg= 10
c arg= 10
A
Traceback (most recent call last):
  File "super_test.py", line 22, in <module>
    E(10)
  File "super_test.py", line 21, in __init__
    super(E,self).__init__(arg)
  File "super_test.py", line 12, in __init__
    super(C,self).__init__()
  File "super_test.py", line 4, in __init__
    super(A,self).__init__()
TypeError: __init__() takes exactly 2 arguments (1 given)
 首先 MRO顺序为E C A D B
调用继续到A.__init__时,我们调用了super(A,self).__init__,其实调用了mro中下一个类型的方法,也就是
D中的__init__,由于D的 __init__带有1个参数,所以报错
所以如果要解决参数匹配的问题,建议采用*arg,**kwargs作为参数,所有的类也都采用super
 

 

分享到:
评论

相关推荐

    supersu压缩包.zip

    总结来说,SuperSu压缩包提供了获取和管理Android设备root权限所需的关键组件。"SuperSU.apk"是界面交互的入口,"supersu2.79"则是实现root功能的后台支持。通过这个工具,用户能够更好地控制自己的设备,但也需要...

    C# supersocket框架

    总结,C#超級套接字框架SuperSocket为开发者提供了一个强大且易用的工具,通过它我们可以便捷地创建高性能的网络服务端和客户端应用。无论是在游戏开发、实时数据交换还是其他需要网络通信的场景,SuperSocket都能...

    Android Superuser源码

    总结,Android Superuser源码的学习可以帮助我们深入理解Android系统的root权限管理机制,提升安全意识,同时对于Android系统开发和安全研究具有重要价值。通过对源码的阅读和分析,开发者可以定制自己的权限管理...

    SuperSocket客户端+服务端完整demo

    总结,`SuperSocket客户端+服务端完整Demo`是一个学习网络编程和SuperSocket框架的理想资源。通过研究和实践,开发者不仅可以掌握TCP通信的基本概念,还能熟悉SuperSocket的用法,为构建自己的网络应用奠定基础。

    SuperSU-v2.82.zip

    总结来说,SuperSU-v2.82.zip是一个重要的Android root权限管理工具,涉及到逆向工程和多平台支持。理解和正确使用SuperSU对于深度定制Android系统、提高安全性和解决问题至关重要。然而,这也需要对Android系统有...

    Java super关键字使用

    ### 总结 `super`关键字在Java中扮演着关键角色,它帮助我们处理继承关系,确保代码的正确性和可维护性。通过使用`super`,我们可以调用父类的构造函数、访问被覆盖的方法以及明确地引用父类的字段。理解和恰当使用...

    SuperObject_delphi_superobject_JSON_jsonparser_dotya_

    总结来说,SuperObject是Delphi开发者处理JSON数据的理想选择,它通过直观的API和丰富的功能,使得JSON的解析和生成变得简单易行。无论是从JSON文件读取数据,还是将应用程序的内部状态输出为JSON,SuperObject都能...

    SuperPoint-SLAM-master.zip

    总结,"SuperPoint-SLAM-master.zip"提供的代码库是一个结合了深度学习和传统SLAM技术的优秀实践,展示了如何利用SuperPoint这一先进的特征检测器提升SLAM系统的性能。通过对这个项目的深入理解和实践,开发者可以...

    SuperCSV-1.52

    总结 SuperCSV-1.52是Java开发者的利器,它简化了CSV数据处理的复杂性,提供了强大的功能和良好的性能。如果你经常处理CSV数据,将这个库集成到你的项目中会大大提高工作效率。记住,理解并熟练使用提供的示例和...

    superobject.zip

    总结来说,SuperObject是Delphi开发中处理JSON数据的得力助手,它的强大功能和开源特性使其在Delphi社区中广受好评。通过深入理解并掌握SuperObject,开发者可以更加自如地应对各种JSON相关的编程挑战。

    SuperSocket 入门,实现客户端和服务端消息互发

    **总结** SuperSocket 提供了一个高效、灵活的平台,使得开发者可以快速构建Socket应用程序,尤其适合需要实现客户端与服务器之间实时通信的场景。通过以上步骤,你将能够成功地搭建一个基础的SuperSocket客户端和...

    ANP,SuperDecisions软件

    总结来说,ANP作为一项决策分析方法,通过SuperDecisions软件得以实现和应用。通过上述获取软件的方法和正确的使用步骤,可以为复杂决策问题提供有效的分析工具,辅助决策者进行科学合理的决策。同时,用户应当遵守...

    supersocket 服务端控制台与客户端winform案例

    总结来说,本案例展示了如何使用SuperSocket框架在C#环境下构建服务端控制台和客户端WinForm应用,实现双方的双向通信。通过对SuperSocket的学习和实践,开发者可以快速构建出稳定、高效的网络应用,适用于各种...

    SuperSocket测试Demo

    总结来说,“SuperSocket测试Demo”是一个学习和实践SuperSocket的绝佳起点,它可以帮助开发者快速理解和掌握SuperSocket的基本用法,为构建高性能、可扩展的TCP网络应用打下坚实基础。在实际开发过程中,建议参考...

    SR5-SuperSU-v2.82-SR5-20171001224502

    总结,SuperSU v2.82 SR5是一款强大的root管理工具,其多平台支持和全面的功能使得它成为Android用户的首选。然而,使用时需谨慎,理解并接受root可能带来的风险,才能更好地利用这一工具提升设备的灵活性和可定制性...

    Superkids1总结.pdf

    Superkids1总结.pdf 本资源总结了 Superkids1 的课程内容,涵盖了六个单元的对话、单词和语法知识。 Unit 1 Back to school 本单元的对话介绍了基本的颜色和数字单词,包括红、绿、蓝、黄、粉、橙、紫、棕、黑九...

    Java this super代码实例及使用方法总结

    Java this 和 super 代码实例及使用方法总结 Java 编程语言中,this 和 super 是两个非常重要的关键字,这两个关键字在面向对象编程中扮演着非常重要的角色。下面我们将详细介绍 Java 中 this 和 super 的用法。 ...

    supervlan配置案例

    Supervlan 配置案例 Supervlan 配置是一种网络...七、总结 Supervlan 配置可以实现二层隔离三层通信,节约 IP 地址,提高网络的可扩展性。但是,需要注意的是,Supervlan 配置需要根据实际网络环境进行调整和优化。

    superObject.rar

    总结,SuperObject在DelphiXE8中的应用为JSON处理带来了极大的便利,无论是在简单的数据交换还是复杂的业务逻辑中,都能发挥出强大的威力。通过深入理解和熟练掌握SuperObject,开发者可以更加高效地处理JSON数据,...

    SuperSocket_demo

    总结来说,SuperSocket是一个强大的Socket服务端开发框架,它的灵活性和高效性使其在.NET开发中受到广泛欢迎。通过提供的DEMO,开发者可以快速上手,掌握网络通信的核心技术,进而构建出自己的高性能网络应用。

Global site tag (gtag.js) - Google Analytics