Loading

面向对象之继承

【一】继承介绍

【1】继承的作用

class Car(object):
    def run(self):
        print('I can run')


class Benz(Car):
    ...


class BWM(Car):
    ...


class Audi(Car):
    ...


car_1 = Benz()
car_2 = BWM()
car_3 = Audi()

car_1.run()
car_2.run()
car_3.run()

'''
I can run
I can run
I can run
'''

总结:

  • 当子类继承父类后,子类就会拥有父类的所有方法

【2】子类重写方法后优先调用子类方法

  • 当子类继承父类后,子类写了一个run方法,父类也写了一个run方法,子类调用run方法时,应该调用父类的run还是子类的?
class Car(object):
    def run(self):
        print('I can run')


class Benz(Car):
    def run(self):
        print('Benz can run')

class BWM(Car):
    def run(self):
        print('BWM can run')


class Audi(Car):
    def run(self):
        print('Audi can run')


car_1 = Benz()
car_2 = BWM()
car_3 = Audi()

car_1.run()
car_2.run()
car_3.run()

'''
Benz can run
BWM can run
Audi can run
'''

总结:

  • 子类拥有和父类同样的方法后会优先调用自己的方法

【3】类的派生

class Car(object):
    def __init__(self, weight):
        self.weight = weight

    def run(self):
        print('I can run')


class Benz(Car):
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def run(self):
        print('Benz can run')


benz = Benz(name='e300', color='白色')
print(benz.name, benz.color) # e300 白色
print(benz.weight) # 报错
# 可是这里发现无法继承物流类`__init__`里的weight
class Car(object):
    def __init__(self, weight):
        self.weight = weight

    def run(self):
        print('I can run')


class Benz(Car):
    def __init__(self, name, color,weight):
        self.name = name
        self.color = color
        super().__init__(weight)

    def run(self):
        print('Benz can run')


benz = Benz(name='e300', color='白色',weight='20t')
print(benz.name, benz.color) # e300 白色
print(benz.weight) # 20t
  • 使用super()超类,调用父类的方法,子类继承父类,子类有父类的属性,且子类有不同于父类的属性,那么这一过程我们成为类的派生

【二】新式类和经典类

什么是新式类 什么是经典类

'''
Python 2 当中类分为新式类和经典类 
Python 3中全部叫新式类  
python 2中如果有继承父类是object 就是新式类,继承其他类不算,但是如果继承其他类,其他类有其他了object 那就是新式类
'''

# 经典类
class 类名:
    pass

# 新式类
class 类名(object):
    pass

经典类的继承特点:深度优先

img

新式类的继承特点:广度优先

img

结合代码说明

class G(object):
    def test(self):
        print('from G')

class E(G):
    def test(self):
        print('from E')

class F(G):
    def test(self):
        print('from F')

class B(E):
    def test(self):
        print('from B')

class C(F):
    def test(self):
        print('from C')

class D(G):
    def test(self):
    	print('from D')
       
class A(B,C,D):
    def test(self):
        print('from A')
a=A()
a.test()
print(A.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性

#新式类继承顺序:A->B->E->C->F->D->G
#经典类继承顺序:A->B->E->G->C->F->D

#python3中统一都是新式类
#pyhon2中才分新式类与经典类

MRO

  • MRO(Method Resolution Order,方法解析顺序)是一个非常重要的概念,尤其在涉及多重继承的情况下。MRO 决定了 Python 如何在继承体系中搜索方法和属性,即当调用一个方法时,Python 会按照什么顺序去查找这个方法。
  • 通过类的 __mro__ 属性或者 mro() 方法来查看任何类的方法解析顺序
class A:
    pass

class B(A):
    pass

class C(B):
    pass

# 查看 MRO
print(C.__mro__)
# 或者
print(C.mro())

posted @ 2024-01-13 23:18  HuangQiaoqi  阅读(3)  评论(0编辑  收藏  举报