当子类需要调用父类的方法时,使用场景最广的应该是继承父类的析构函数(子类也谢了析构函数,并且需要继承父类的析构时可以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就好)