一、在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压缩包提供了获取和管理Android设备root权限所需的关键组件。"SuperSU.apk"是界面交互的入口,"supersu2.79"则是实现root功能的后台支持。通过这个工具,用户能够更好地控制自己的设备,但也需要...
总结,C#超級套接字框架SuperSocket为开发者提供了一个强大且易用的工具,通过它我们可以便捷地创建高性能的网络服务端和客户端应用。无论是在游戏开发、实时数据交换还是其他需要网络通信的场景,SuperSocket都能...
总结,Android Superuser源码的学习可以帮助我们深入理解Android系统的root权限管理机制,提升安全意识,同时对于Android系统开发和安全研究具有重要价值。通过对源码的阅读和分析,开发者可以定制自己的权限管理...
总结,`SuperSocket客户端+服务端完整Demo`是一个学习网络编程和SuperSocket框架的理想资源。通过研究和实践,开发者不仅可以掌握TCP通信的基本概念,还能熟悉SuperSocket的用法,为构建自己的网络应用奠定基础。
总结来说,SuperSU-v2.82.zip是一个重要的Android root权限管理工具,涉及到逆向工程和多平台支持。理解和正确使用SuperSU对于深度定制Android系统、提高安全性和解决问题至关重要。然而,这也需要对Android系统有...
### 总结 `super`关键字在Java中扮演着关键角色,它帮助我们处理继承关系,确保代码的正确性和可维护性。通过使用`super`,我们可以调用父类的构造函数、访问被覆盖的方法以及明确地引用父类的字段。理解和恰当使用...
总结来说,SuperObject是Delphi开发者处理JSON数据的理想选择,它通过直观的API和丰富的功能,使得JSON的解析和生成变得简单易行。无论是从JSON文件读取数据,还是将应用程序的内部状态输出为JSON,SuperObject都能...
总结,"SuperPoint-SLAM-master.zip"提供的代码库是一个结合了深度学习和传统SLAM技术的优秀实践,展示了如何利用SuperPoint这一先进的特征检测器提升SLAM系统的性能。通过对这个项目的深入理解和实践,开发者可以...
总结 SuperCSV-1.52是Java开发者的利器,它简化了CSV数据处理的复杂性,提供了强大的功能和良好的性能。如果你经常处理CSV数据,将这个库集成到你的项目中会大大提高工作效率。记住,理解并熟练使用提供的示例和...
总结来说,SuperObject是Delphi开发中处理JSON数据的得力助手,它的强大功能和开源特性使其在Delphi社区中广受好评。通过深入理解并掌握SuperObject,开发者可以更加自如地应对各种JSON相关的编程挑战。
**总结** SuperSocket 提供了一个高效、灵活的平台,使得开发者可以快速构建Socket应用程序,尤其适合需要实现客户端与服务器之间实时通信的场景。通过以上步骤,你将能够成功地搭建一个基础的SuperSocket客户端和...
总结来说,ANP作为一项决策分析方法,通过SuperDecisions软件得以实现和应用。通过上述获取软件的方法和正确的使用步骤,可以为复杂决策问题提供有效的分析工具,辅助决策者进行科学合理的决策。同时,用户应当遵守...
总结来说,本案例展示了如何使用SuperSocket框架在C#环境下构建服务端控制台和客户端WinForm应用,实现双方的双向通信。通过对SuperSocket的学习和实践,开发者可以快速构建出稳定、高效的网络应用,适用于各种...
总结来说,“SuperSocket测试Demo”是一个学习和实践SuperSocket的绝佳起点,它可以帮助开发者快速理解和掌握SuperSocket的基本用法,为构建高性能、可扩展的TCP网络应用打下坚实基础。在实际开发过程中,建议参考...
总结,SuperSU v2.82 SR5是一款强大的root管理工具,其多平台支持和全面的功能使得它成为Android用户的首选。然而,使用时需谨慎,理解并接受root可能带来的风险,才能更好地利用这一工具提升设备的灵活性和可定制性...
Superkids1总结.pdf 本资源总结了 Superkids1 的课程内容,涵盖了六个单元的对话、单词和语法知识。 Unit 1 Back to school 本单元的对话介绍了基本的颜色和数字单词,包括红、绿、蓝、黄、粉、橙、紫、棕、黑九...
Java this 和 super 代码实例及使用方法总结 Java 编程语言中,this 和 super 是两个非常重要的关键字,这两个关键字在面向对象编程中扮演着非常重要的角色。下面我们将详细介绍 Java 中 this 和 super 的用法。 ...
Supervlan 配置案例 Supervlan 配置是一种网络...七、总结 Supervlan 配置可以实现二层隔离三层通信,节约 IP 地址,提高网络的可扩展性。但是,需要注意的是,Supervlan 配置需要根据实际网络环境进行调整和优化。
总结,SuperObject在DelphiXE8中的应用为JSON处理带来了极大的便利,无论是在简单的数据交换还是复杂的业务逻辑中,都能发挥出强大的威力。通过深入理解和熟练掌握SuperObject,开发者可以更加高效地处理JSON数据,...
总结来说,SuperSocket是一个强大的Socket服务端开发框架,它的灵活性和高效性使其在.NET开发中受到广泛欢迎。通过提供的DEMO,开发者可以快速上手,掌握网络通信的核心技术,进而构建出自己的高性能网络应用。