博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中super用法
阅读量:5096 次
发布时间:2019-06-13

本文共 3368 字,大约阅读时间需要 11 分钟。

转:https://blog.csdn.net/u011467044/article/details/52205961

 

python语言与C++有相似的类继承,在类定义时,python中会自定义第一个self,类似C++中this指针,指向对象自身。

python简单的类举例:

 

[python]   
 
  1. >>> class hello(object):  
  2. ...         def print_c():  
  3. ...             print"hello world!"  
  4. >>> hello().print_c()  
  5. hello world!  

当然在实际中不可避免的需要类的继承,子类继承父类,正常如下:

 

 

[python]   
 
  1. >>> class child(hello):  
  2. ...         def print_c(self):  
  3. ...                 hello().print_c()  
  4. ...                   
  5. >>> child().print_c()  
  6. hello world!  

在python中还提供了super()机制,例子如下:

 

 

[python]   
 
  1. >>> class hello(object):  
  2. ...         def print_c(self):  
  3. ...             print"hello world!"  
  4. ...               
  5. >>> class child(hello):  
  6. ...         def print_c(self):  
  7. ...                 super(child,self).print_c()  
  8. ...                   
  9. >>> child().print_c()  
  10. hello world!  

第一眼看过来是不是感觉一样?

 

在python中引入super()的目的是保证相同的基类只初始化一次(注意:

1super ()机制是用来解决多重继承的,对于直接调用父类名是没有问题的,但在之后根据前人的经验就是:要么都用类名调用,要么就全部用super(),不要混合的用,由此为人做事还是要专一的嘛O(∩_∩)O~

2 super()继承只能用于新式类,用于经典类时就会报错。

新式类:必须有继承的类,如果无继承的,则继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj)

好,再举一个例子

 

[python]   
 
  1. class parent1(object):  
  2.     def __init__(self):  
  3.         print 'is parent1'  
  4.         print 'goes parent1'  
  5.   
  6. class parent2(object):  
  7.     def __init__(self):  
  8.         print 'is parent2'  
  9.         print 'goes parent2'  
  10.   
  11. class child1(parent1):  
  12.     def __init__(self):  
  13.         print'is child1'  
  14.         parent.__init__(self)  
  15.         print 'goes child1'  
  16.   
  17. class child2 (parent1) :  
  18.     def __init__(self):  
  19.         print 'is child2'  
  20.         parent.__init__(self)  
  21.         print 'goes child2'  
  22.   
  23. class child3(parent2):  
  24.     def __init__(self):  
  25.         print 'is child3'  
  26.         parent2.__init__(self)  
  27.         print 'goes child3'  
  28.   
  29. class grandson(child3,child2,child1):  
  30.     def __init__(self):  
  31.         print 'is grandson'  
  32.         child1.__init__(self)  
  33.         child2.__init__(self)  
  34.         child3.__init__(self)  
  35.         print'goes grandson'  
  36.   
  37.   
  38. if __name__=='__main__':  
  39.     grandson()  
[python]   
 
  1. is grandson  
  2. is child1  
  3. is parent1  
  4. goes parent1  
  5. goes child1  
  6. is child2  
  7. is parent1  
  8. goes parent1  
  9. goes child2  
  10. is child3  
  11. is parent2  
  12. goes parent2  
  13. goes child3  
  14. goes grandson  
[python]   
 
  1.   
[python]   
 
  1. 好了,在这儿发现什么问题了没有?对,基类parent1被多次执行,而有时我们只希望公共的类只被执行一次,那么此时我们引入super()机制查看效果:  
[python]   
 
  1. <span style="font-family: Arial, Helvetica, sans-serif;">class parent1(object):</span>  
[python]   
 
  1.     def __init__(self):  
  2.         super(parent1, self).__init__()  
  3.         print 'is parent1'  
  4.         print 'goes parent1'  
  5.   
  6. class parent2(object):  
  7.     def __init__(self):  
  8.         super(parent2, self).__init__()  
  9.         print 'is parent2'  
  10.         print 'goes parent2'  
  11.   
  12. class child1(parent1):  
  13.     def __init__(self):  
  14.         print'is child1'  
  15.         #parent1.__init__(self)  
  16.         super(child1, self).__init__()  
  17.         print 'goes child1'  
  18.   
  19. class child2 (parent1) :  
  20.     def __init__(self):  
  21.         print 'is child2'  
  22.         #parent1.__init__(self)  
  23.         super(child2, self).__init__()  
  24.         print 'goes child2'  
  25.   
  26. class child3(parent2):  
  27.     def __init__(self):  
  28.         print 'is child3'  
  29.         #parent2.__init__(self)  
  30.         super(child3, self).__init__()  
  31.         print 'goes child3'  
  32.   
  33. class grandson(child3,child2,child1):  
  34.     def __init__(self):  
  35.         print 'is grandson'  
  36.         #child1.__init__(self)  
  37.         #child2.__init__(self)  
  38.         #child3.__init__(self)  
  39.         super(grandson, self).__init__()  
  40.           
  41.         print'goes grandson'  
  42.   
  43.   
  44. if __name__=='__main__':  
  45.     grandson()  

 

 

 
[python]   
 
  1. 此时我们查看结果:  
[python]   
 
  1. is grandson  
  2. is child3  
  3. is child2  
  4. is child1  
  5. is parent1  
  6. goes parent1  
  7. goes child1  
  8. goes child2  
  9. is parent2  
  10. goes parent2  
  11. goes child3  
  12. goes grandson  

结果很明显,公共基类parent1只被执行一次。

 

grandson类的继承体系如下图所示:

 

[python]   
 
  1.    object  
  2.        |  
  3.      /   \  
  4.   P1    P2  
  5. /     \      |  
  6.    C2  C3  
[python]   
 
  1.   

所以对于类的继承体系,我们可以看做一个图,而每一个类看做一个节点,那么super()机制的执行顺序是按照图的广度优先搜索算法查找super()的父类。

 

后续总结:

  1. super()是一个类名而非函数,super(class, self)事实上调用了super类的初始化函数,产生了一个super对象;

        2 super()机制必须要用新式类,否则会报错;

        3 super()或直接父类调用最好只选择一种形式。

转载于:https://www.cnblogs.com/shmily2018/p/9073880.html

你可能感兴趣的文章
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
backgound-attachment属性学习
查看>>
个人作业——关于K米的产品案例分析
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
java web 中base64传输的坑
查看>>
java 中的线程(一)
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
素数判断BFS之“Prime Path”
查看>>
Activiti入门 -- 环境搭建和核心API简介
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
IOS push消息的数字不减少的问题
查看>>
mysql报错Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
Django中间件
查看>>
Hdfs数据备份
查看>>
xcode 5.1安装vvdocument
查看>>