python 的super使用

来源:互联网 发布:邹平php 编辑:程序博客网 时间:2024/05/17 06:59

当子类需要调用父类的方法时,使用场景最广的应该是继承父类的析构函数(子类也谢了析构函数,并且需要继承父类的析构时可以super一下将父类的析构继承到子类),其余的如果要改写子类的函数(且子类的这个函数和父类同名,并且用到了父类该同名函数)才会去用到super吧?(要调父类的方法直接就可以继承下来用self.fuction()就可以调用了,想知道一下super的,其他应用场景)

上一段代码(爷爷,爸爸,妈妈,儿子的继承关系)

class FooGra(object):    def __init__(self):        self.gradpaname = "gradapa"        self.age = "gradpa age"    def bar(self, message):        print "in gra"        print message        print "out gra"class FooDad(FooGra):    def __init__(self):        self.dadname = "dad"        self.age = "dad age"    def bara(self, message):        print "in dad"        print message        print "out dad"class FooMom(FooGra):    def __init__(self):        self.barmomname = "mom"        self.age = "mom age"    def bar(self, message):        print "in mom"        print message        print "out mom"class FooChild(FooDad, FooMom):    def __init__(self):        self.childname = "child"        self.age = "child age"        super(FooChild, self).__init__()    def mirror(self, message):        print "in child"        #super(FooChild, self).bar(message)        self.bar(message)        print "out child"FooChild().mirror("hehe") #调的mirror继承了bar的实现,只会往上一层调(如果dad没有,会在同一层调用mom,而不是调grandpa,新式类的调用关系)print FooChild().childname#当使用super继承父类的析构函数时,不会继承同一层的mom的析构(从左至右顺序,想同时继承mom该怎么写呢?)<pre name="code" class="python">print FooChild().dadname  #在dad层在继承dad的父类析构,然后通过FooChild去访问爷爷的name时能继承成功,就像一个链条一样
#print FooChild().momnameprint FooChild().gradpaname

上面练习了一下。


老式类和新式类的区别就在于,最上层的基类有没有继承object,如 class Base(object):   --->(貌似新版本的python都默认成新式类了,新式类和老式类在继承父类的顺序有差异,老式是深度优先,新式是广度优先)

然后,继承父类也有两种方法,一种是上面提到的super,还有一种直接用类调用,比如:FooDad.__init__(self),两种方法虽然都是继承父类但还是有差别

1.两种方法不能混用,选其一就可以

2.当然是super比较省事,不至于父类名字改了,造成子类继承也要改代码

3.而且通过类去调用父类方法会多次调父类,在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(还没有探索mro,用super就好)



0 0
原创粉丝点击