python類的三大特性---多態
阿新 • • 發佈:2019-05-08
形式 imp 來看 活性 UNC 裝飾器 多態 clas 不同
抽象類
抽象類的概念:
抽象類是一個特殊的類,它的特殊之處在於只能被繼承,不能被實例化。
抽象類的作用:
如果說類是從一堆對象中抽取相同的內容而來的,那麽抽象類就是從一堆類中抽取相同的內容而來的,內容包括數據屬性和函數屬性,
從設計角度去看,如果類是從現實對象抽象而來的,那麽抽象類就是基於類抽象而來的。
從實現角度來看,抽象類與普通類的不同之處在於:抽象類中只能有抽象方法(沒有實現功能),該類不能被實例化,只能被繼承,且子類必須實現抽象方法。
如果一組類中有相似的方法,為了方便使用可以使用抽象類將這些相似的方法定義到抽象類中,好像形成了一個接口,統一了這些相似的方法。
import abc # 使用abc模塊實現抽象類 class All_file(metaclass=abc.ABCMeta): # 定義一個抽象類 all_type = "file" @abc.abstractmethod # 裝飾器的作用是實現抽象方法,無需實現功能 def read(self): # 方法在子類中實現 pass @abc.abstractmethoddef write(self): pass class Txt(All_file): # 子類繼承抽象類,就必須實現抽象類裏的read和write方法 def __init__(self, name): self.name = name def read(self): print("%s可以被讀取" % self.name) def write(self): print("%s可以被寫入" % self.name)class Sata(All_file): # 子類繼承抽象類,就必須實現抽象類裏的read和write方法 def __init__(self, name): self.name = name def read(self): print("%s可以被讀取" % self.name) def write(self): print("%s可以被寫入" % self.name) txt = Txt("txt") sata = Sata("sata") txt.read() txt.write() sata.read() sata.write()
抽象類和接口:
抽象類的本質還是類,指的是一組類的相似性,包括數據屬性(如all_type)和函數屬性(如read、write),而接口只強調函數屬性的相似性。
抽象類是一個介於類和接口直接的一個概念,同時具備類和接口的部分特性,可以用來實現歸一化設計
多態和多態性
多態指一類事物的多種形態,他們都有相似的屬性或技能
跟抽象類剛好一反,我們抽取類中相似的方法形成一個抽象類,那麽這一系列類也正是這個抽象類的不同形態。
class Animal(metaclass=abc.ABCMeta): # 動物類 def __init__(self, name): self.name = name @abc.abstractmethod def talk(self): pass class People(Animal): # 動物類的一種形態 人 def __init__(self, name): self.name = name def talk(self): print("%s 說中國話" % self.name) class Dog(Animal): # 動物類的另一種形態 狗 def __init__(self, name): self.name = name def talk(self): print("%s 說汪汪" % self.name) people = People("people") dog = Dog("dog") people.talk() dog.talk()
多態性:
多態性是指在不考慮實例類型的情況下使用實例,多態性分為靜態多態性和動態多態性
靜態多態性:如任何類型都可以用運算符+進行運算
動態多態性:如下
class Animal(metaclass=abc.ABCMeta): # 動物類 def __init__(self, name): self.name = name @abc.abstractmethod def talk(self): pass class People(Animal): # 動物類的一種形態 人 def __init__(self, name): self.name = name def talk(self): print("%s 說中國話" % self.name) class Dog(Animal): # 動物類的另一種形態 狗 def __init__(self, name): self.name = name def talk(self): print("%s 說汪汪" % self.name) #更進一步,我們可以定義一個統一的接口來使用 def func(obj): obj.talk() people = People("people") dog = Dog("dog") func(people) func(dog)
為什麽要使用多態性:
1.增加了程序的靈活性
以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用,如func(animal)
2.增加了程序額可擴展性
通過繼承animal類創建了一個新的類,使用者無需更改自己的代碼,還是用func(animal)去調用
python類的三大特性---多態