码迷,mamicode.com
首页 > 编程语言 > 详细

Python中super的用法

时间:2015-12-29 11:09:43      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。

普通继承

class FooParent(object):
    def __init__(self):
        self.parent = I\‘m the parent.
        print Parent
    
    def bar(self,message):
        print message, from Parent
        
class FooChild(FooParent):
    def __init__(self):
        FooParent.__init__(self)
        print Child
        
    def bar(self,message):
        FooParent.bar(self,message)
        print Child bar function.
        print self.parent
        
if __name__==__main__:
    fooChild = FooChild()
    fooChild.bar(HelloWorld)

 

super继承

class FooParent(object):
    def __init__(self):
        self.parent = I\‘m the parent.
        print Parent
    
    def bar(self,message):
        print message,from Parent

class FooChild(FooParent):
    def __init__(self):
        super(FooChild,self).__init__()
        print Child
        
    def bar(self,message):
        super(FooChild, self).bar(message)
        print Child bar fuction
        print self.parent

if __name__ == __main__:
    fooChild = FooChild()
    fooChild.bar(HelloWorld)

程序运行结果相同,为:

Parent
Child
HelloWorld from Parent
Child bar fuction
I‘m the parent.

从运行结果上看,普通继承和super继承是一样的。但是其实它们的内部运行机制不一样,这一点在多重继承时体现得很明显。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
注意:super继承只能用于新式类,用于经典类时就会报错。
新式类:必须有继承的类,如果没什么想继承的,那就继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』

 

更详细的参考

http://blog.csdn.net/johnsonguo/article/details/585193

总结
  1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,
       产生了一个super对象;
  2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
  3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
  4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
       只调用一次(如果每个类都使用super);
  5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一
       个父类函数被调用多次。

Python中super的用法

标签:

原文地址:http://www.cnblogs.com/wjx1/p/5084980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!