標籤:動物 animal 屬性 代碼 執行個體 查看 abc ... pass
繼承
繼承的表現方式:
class Animal(): passclass Cat(Animal): #animal是cat的父類,也可以說是基類 passprint(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 passd = 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,ABCMetaclass Fly_Animal(metaclass=ABCMeta): @abstractmethod def fly(self): passclass Walk_Animal(metaclass=ABCMeta): @abstractmethod def walk(self): passclass Swim_Animal(metaclass=ABCMeta): @abstractmethod def swim(self): passclass Bird(Fly_Animal,Walk_Animal):passclass Dog(Walk_Animal,Swim_Animal):passclass Duck(Walk_Animal,Swim_Animal,Fly_Animal):passb = 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天生支援多態
鴨子類型
python中的繼承和多態