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天生支持多态

鸭子类型

原文地址:https://www.cnblogs.com/jiangchengcheng/p/9606099.html