繼承的表現方式:java
class Animal(): pass class Cat(Animal): #animal是cat的父類,也能夠說是基類 pass print(Cat.__bases__)#查看Cat的全部父類
一個類只有一個父類python
狗和鳥都是動物,都擁有吃喝這兩種技能,但游泳是狗的特殊技能,飛逝鳥的特殊技能,只能在本類中進行擴展算法
實現了子類中獨有方法,那子類有獨有的屬性呢?我養了一個小泰迪,我給他起個名字,可是鳥就沒有這個屬性ide
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)
一個類有多個父類spa
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中的概念,目的是制定一個規範code
接口類和抽象類都不能被實例化blog
# 接口類 # 支持多繼承,接口類中的全部方法都不能實現 # 抽象類 # 不支持多繼承,抽象類中的方法能夠被實現
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 裝飾器的方法,不然報錯
規定只使用單繼承it
實現一個抽象類
import abc #建立一個規範類 class Payment(metaclass=abc.ABCMeta):#指定元類 @abc.abstractmethod def pay(self):pass #繼承該類的類必須實現本方法
python天生支持多態
鴨子類型