继承
继承的表现方式:
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 # #以菱形多继承为例,发现是根据优先算法找到的上一级
接口类和抽象类
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天生支持多态
鸭子类型