• python中的继承和多态


    继承

    继承的表现方式:

    class Animal():
        pass
    class Cat(Animal):  #animal是cat的父类,也可以说是基类
        pass
    print(Cat.__bases__)#查看Cat的所有父类

    单继承

    一个类只有一个父类

    狗和鸟都是动物,都拥有吃喝这两种技能,但游泳是狗的特殊技能,飞逝鸟的特殊技能,只能在本类中进行扩展

    子类中独有方法如何实现

    实现了子类中独有方法,那子类有独有的属性呢?我养了一个小泰迪,我给他起个名字,但是鸟就没有这个属性

    class Animal():
        def __init__(self,kind):
            self.kind = kind
        def eat(self):
            print('eat...')
        def drink(self):
            print('drink...')
    
    class Dog(Animal):
        def __init__(self,kind,name):
            # Animal.__init__(self,kind)  #为继承的父类中的属性初始化赋值
            super().__init__(kind)  #用super找到父类   跟上句话的效果相同
            self.name = name    #为本类独有的属性进行初始化赋值,派生属性
        def swimming(self):
            print('dog swimming')
    
    class Bird(Animal):
        def fly(self):
            print('bird flying')
        def eat(self):
            print('bird eat')
    
    b1 = Bird('麻雀')
    b2 = Dog('tiddy','judy')
    print(b1.kind)
    print(b2.name)
    子类中独有属性如何实现

    多继承

    一个类有多个父类

    class A():
        def fun(self):
            print('aaa')
    class B():
        def fun(self):
            print('bbb')
    class C():
        def fun(self):
            print('ccc')
    class D(A,B,C):     #继承A,B,C
        pass
    d = D()
    d.fun()     #aaa--->调用A类中的fun方法,按照继承顺序A
    简单多继承
    钻石继承
    '''
    A
    B C

    D E
    F
    F继承DE,D继承B,E继承C,BC继承A
    顺序是:F->D->B->E->C->A
    '''
    # 另一个问题,关于super,super真的是找父类吗?
    # class A():
    #     def fun(self):
    #         print('a')
    # class B(A):
    #     def fun(self):
    #         super().fun()   #-->找C
    #         print('b')
    # class C(A):
    #     def fun(self):
    #         super().fun()   #-->找A
    #         print('c')
    # class D(B,C):     #继承B,C
    #     def fun(self):
    #         super().fun()   #-->找B
    #         print('d')
    # d = D()
    # d.fun()     #打印结果是  a c b d
    # #以菱形多继承为例,发现是根据优先算法找到的上一级
    super问题

    接口类和抽象类

    python中其实是没有接口的概念的,接口类和抽象类是java中的概念,目的是制定一个规范

    接口类和抽象类都不能被实例化

    # 接口类
    #     支持多继承,接口类中的所有方法都不能实现
    # 抽象类
    #     不支持多继承,抽象类中的方法可以被实现

    接口类

    from abc import abstractmethod,ABCMeta
    #创建一个规范类
    class Payment(metaclass=ABCMeta):#指定元类
        @abstractmethod
        def pay(self):pass  #继承该类的类必须实现本方法

    接口类的多继承

    思考:

    如何在代码尽不重复的情况下,定义三个类:1.鸟-->会飞,会走 2.狗-->会游泳,会走 3.鸭子-->会游泳,会飞,会走

    from abc import abstractmethod,ABCMeta
    class Fly_Animal(metaclass=ABCMeta):
        @abstractmethod
        def fly(self):
            pass
    class Walk_Animal(metaclass=ABCMeta):
        @abstractmethod
        def walk(self):
            pass
    class Swim_Animal(metaclass=ABCMeta):
        @abstractmethod
        def swim(self):
            pass
    class Bird(Fly_Animal,Walk_Animal):pass
    class Dog(Walk_Animal,Swim_Animal):pass
    class Duck(Walk_Animal,Swim_Animal,Fly_Animal):pass
    b = Bird()  #  报错  TypeError: Can't instantiate abstract class Bird with abstract methods fly, walk
    # 继承规范接口类的类必须实现加@abstractmethod 装饰器的方法,否则报错
    接口类的多继承

    抽象类

    规定只使用单继承

    实现一个抽象类

    import
    abc #创建一个规范类 class Payment(metaclass=abc.ABCMeta):#指定元类 @abc.abstractmethod def pay(self):pass #继承该类的类必须实现本方法

    多态

    python天生支持多态

    鸭子类型

  • 相关阅读:
    高进度乘法FFT优化
    Activity的四种加载模式
    异步任务AsyncTask
    利用Handler在子线程中更新UI
    Android 屏幕旋转监听
    HDOJ-1698-线段树成段更新
    HDOJ-1671-字典树
    HDOJ-1251 字典树
    python数据结构与算法
    find the lowest number location
  • 原文地址:https://www.cnblogs.com/jiangchengcheng/p/9606099.html
Copyright © 2020-2023  润新知