python基础 #007 继承,传递,多态

Python面向对象中继承,传递和多态是个非常重要的知识点,能够使得对象更具有共同性和多样性

1. 继承

  • 子类继承父类,子类拥有父类的属性和方法

    class Animal:
        def eat(self):
            print('吃')
        def drink(self):
            print('喝')
        def run(self):
            print('跑')
            
    # Animal为父类,dog 为 Animal 的子类      
    class dog(Animal):
        def bark(self):
            print('旺旺旺')
    
    # 子类继承父类的属性和方法
    dog = dog()
    dog.run()
    dog.eat()
    
    # 子类拥有自己的属性和方法
    dog.bark()
    
    >>>
    跑
    吃
    旺旺旺
    

2. 传递

  • 子类继承父类的父类,子类拥有父类的父类的属性和方法

    可理解: 儿子像他爸也像他爷爷

    class Animal:
        def eat(self):
            print('吃')
        def drink(self):
            print('喝')
        def run(self):
            print('跑')
       
    class dog(Animal):
        def bark(self):
            print('旺旺旺')
    
    class XiaoTianQuan(dog):
        def fly(self):
            print('我会飞')
     
    # 子类调用自己的方法       
    dog = XiaoTianQuan()
    #子类调用父类的方法
    dog.fly()
    dog.bark()
    dog.eat()
    
    >>>
    我会飞
    旺旺旺
    吃
    

3. 多继承

  • 子类同时继承多个父类,同时拥有多个父类的属性和方法

    # 尽量避免父类之间的方法/属性重名,若重名根据继承顺序执行重名方法/属性
    class A:
        def test(self):
            print('aaaa')
        def first(self):
            print('A-------')
    
    class B:
        def object(self):
            print('bbbbb')
        def first(self):
            print('B-------')
    
    class D(A,B):
        pass
    
    d = D()
    d.test()
    d.object()
    d.first()
    
    >>>
    aaaa
    bbbbb
    A-------
    

4. MRO

查看子类的继承顺序

搜索属性/方法的顺序,先从自身找,再从父类.......基类, 没有则报错

class A:
    def first(self):
        print('A-------')
        
class B:
    def first(self):
        print('B-------')
        
class D(A,B):
    pass

d = D()
d.first()
print(D.__mro__)

>>>
A-------
(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

5. 多态

  • 方法重写

    class dog:
        def bark(self):
            print('旺旺旺')
    
    class XiaoTianQuan(dog):
        def bark(self):
            print('神犬,嗷嗷嗷')
            
    # 当父类的属性不满足子类时,可在子类中重写,覆盖父类的方法
    dog = XiaoTianQuan()
    dog.bark()
    
    >>>
    神犬,嗷嗷嗷
    
  • 方法重构

    保留父类的方法,添加功能

    class dog:
        def bark(self):
            print('旺旺旺')
    
    class XiaoTianQuan(dog):
        # 当父类的方法不满足子类的需求,可以在父类的方法基础上增加功能
        def bark(self):
            print('神犬')
            # 调用父类的方法
            super().bark()
            print('我还会fei')
          
    dog = XiaoTianQuan()
    dog.bark()
    
    >>>
    神犬
    旺旺旺
    我还会fei
    
posted @ 2023-06-28 22:49  枫_Null  阅读(13)  评论(0)    收藏  举报