python 继承顺序系列 二
直接给出例子,你知道函数的继承顺序吗? 看下面的例子
#!/usr/bin/env python
# coding=utf-8
class Ser(object):
def build(self):
print("Ser build self: %s"%self)
class Def(Ser):
def build_default(self):
print("Def build_default self: %s"%self)
class Pac(Ser):
def build_packet(self):
print("Pac build_packet then self.build self: %s"%self)
self.build()
class Q1(Pac):
def build(self):
print("Q1 build self: %s"%self)
print("self.__class__.mro(): %s"%self.__class__.mro())
print("then super build")
super(Q1, self).build()
class Com(Pac):
def build(self):
print("Com build then self.build_command self: %s"%self)
self.build_command()
def build_command(self):
print("Com build_command self: %s"%self)
class DefC(Def, Com):
def build_command(self):
print("DefC build_command then self.build_default self: %s"%self)
self.build_default()
class Q(Q1, DefC):
pass
if __name__ == "__main__":
q = Q()
q.build_packet() #接下来会发生什么,如果没有面的print 函数,你知道正确的执行顺序吗?
run 一下就知道顺序了
Pac build_packet then self.build self: <__main__.Q object at 0x7f6cf8033410>
Q1 build self: <__main__.Q object at 0x7f6cf8033410>
self.__class__.mro(): [<class '__main__.Q'>, <class '__main__.Q1'>, <class '__main__.DefC'>,
<class '__main__.Def'>, <class '__main__.Com'>, <class '__main__.Pac'>, <class '__main__.Ser'>, <type 'object'>]
then super build
Com build then self.build_command self: <__main__.Q object at 0x7f6cf8033410>
#为什么下面不执行Com的build_command方法,这里输出了self,所以你很清楚,
#它会按照上面我们mro给出的顺序去找对应的函数,因此执行了 DefC的build_command 函数
DefC build_command then self.build_default self: <__main__.Q object at 0x7f6cf8033410> #如何不执行这条程序?!!!
Def build_default self: <__main__.Q object at 0x7f6cf8033410>
看到!!!这个标记的地方,我们应该怎样做,使得不输出这一个信息呢?按照mro给出的顺序,在前面重写这个函数即可,试一下。那就在Q1类重写build_command函数
,,,/super$ cat tmp2.py
#!/usr/bin/env python
# coding=utf-8
class Ser(object):
def build(self):
print("Ser build self: %s"%self)
class Def(Ser):
def build_default(self):
print("Def build_default self: %s"%self)
class Pac(Ser):
def build_packet(self):
print("Pac build_packet then self.build self: %s"%self)
self.build()
class Q1(Pac):
def build(self):
print("Q1 build self: %s"%self)
print("self.__class__.mro(): %s"%self.__class__.mro())
print("then super build")
super(Q1, self).build()
def build_command(self):
print("Q1 build_command overwrite, so do not exec in Com build_command; then self.build_default") #!!!
self.build_default()
class Com(Pac):
def build(self):
print("Com build then self.build_command self: %s"%self)
self.build_command()
def build_command(self):
print("Com build_command self: %s"%self)
class DefC(Def, Com):
def build_command(self):
print("DefC build_command then self.build_default self: %s"%self)
self.build_default()
class Q(Q1, DefC):
pass
if __name__ == '__main__':
q = Q()
q.build_packet()
看一下顺序,就知道了 Q1先执行了
Pac build_packet then self.build self: <__main__.Q object at 0x7f227f815350>
Q1 build self: <__main__.Q object at 0x7f227f815350>
self.__class__.mro(): [<class '__main__.Q'>, <class '__main__.Q1'>, <class '__main__.DefC'>,
<class '__main__.Def'>, <class '__main__.Com'>, <class '__main__.Pac'>, <class '__main__.Ser'>, <type 'object'>]
then super build
Com build then self.build_command self: <__main__.Q object at 0x7f227f815350>
Q1 build_command overwrite, so do not exec in Com build_command; then self.build_default #!!!
Def build_default self: <__main__.Q object at 0x7f227f815350>