繼承
繼承的表現方式:
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天生支持多態
鴨子類型