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>
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐