python-类的继承

1.简单继承

class F1:  #父类,或者基类
    def show(self):
        print('F1.show')

class F2(F1):  #表示F2继承F1。F2叫子类,或者派生类
    def bar(self):
        print('bar')

obj = F2()
obj.show()
obj.bar()

out:

F1.show
bar

2.父类和子类有相同的方法,优先执行子类中的方法

class F1:  #父类,或者基类
    def show(self):
        print('F1.show')

class F2(F1):  #表示F2继承F1。F2叫子类,或者派生类

    def bar(self):
        print('bar')
    def show(self):   #子类优先级高
        print('F2.show')

obj = F2()
obj.show()
obj.bar()

out:

F2.show
bar

3.子类中封装数据,父类中也可以访问

class F1:  #父类,或者基类
    def show(self):
        print('F1.show')
    def foo(self):
        print(self.name)

class F2(F1):  #表示F2继承F1。F2叫子类,或者派生类
    def __init__(self,name):
        self.name = name

    def bar(self):
        print('bar')


obj = F2('xiaoming')
obj.foo()    #输出是xiaoming , 继承就相当于把父类的方法放到了子类中,所以这里输出的是xiaoming

out:

4.复杂继承

class S1:
    def F1(self):
        self.F2()  #此时的self相当于对象obj
    def F2(self):
        print('S1.F2')

class S2(S1):
    def F3(self):
        self.F1()
    def F2(self):
        print('S2.F2')

obj = S2()
obj.F3()
#输出是S2.F2  , 执行过程:执行S2类中的F3方法时,会去执行self.F1()方法,因为S2中没有该方法,所以去父类中寻找,父类有该方法,
# 那么就执行父类中的F1()方法,在执行F1()方法时,会执行self.F2()。因为继承的本质是把父类的方法复制到子类中,
# 所以def F1(self):self.F2() 放到了S2类中,因为S2类中有F2方法,所以执行S2类中的F2()方法。子类和父类有相同的方法时,子类方法优先级高。

#只要到self.F2()这样的时候,直接回到原点寻找。例如该例子中应该回到S2类中寻找F2()方法,
# 发现子类S2中有该方法,那么直接执行。如果S2类中没有,那么去父类中寻找F2()方法

二、多继承

1、简单的多继承
class C0:
    def f1(self):
        print('C0_f1')
class C1(C0):

    def f2(self):
        print('C1_f2')

class C2:
    def f2(self):
        print('C2_f2')

class C3(C2,C1):   #从左到右继承,左边的优先级高
    def f3(self):
        pass

obj = C3()
obj.f2()    #输出C2_f2

out:

C2_f2

 

2、复杂的多继承

class C0:
    def f2(self):
        print('C0_f1')
class C1(C0):

    def f1(self):
        print('C1_f2')

class C2:
    def f2(self):
        print('C2_f2')

class C3(C1,C2):   #从左到右继承,左边的优先级高
    def f3(self):
        pass

obj = C3()
obj.f2()    #输出C0_f1

out:

C0_f1

执行流程:

 
3、复杂继承关系
class C_2:
    def f2(self):
        print('C_2_f2')
class C_1(C_2):
    def f2(self):
        print('C_1_f2')
class C0(C_2):
    def f1(self):
        print('C0_f2')
class C1(C0):

    def f1(self):
        print('C1_f2')

class C2(C_1):
    def f2(self):
        print('C2_f2')

class C3(C1,C2):   #从左到右继承,左边的优先级高
    def f3(self):
        pass

obj = C3()
obj.f2()    #输出C0_f1

out:

C2_f2

执行流程

总结:
如果子类的两个父类没有共同的父类的话,是一条道走到黑

如果子类的两个父类有共同的父类的话,是C1-->C0   然后是C2-->C_1-->C_2

posted @ 2016-07-23 22:06  unixfbi.com  阅读(271)  评论(0编辑  收藏  举报