1. 程式人生 > >python類的三大特性---多態

python類的三大特性---多態

形式 imp 來看 活性 UNC 裝飾器 多態 clas 不同

抽象類

抽象類的概念:

抽象類是一個特殊的類,它的特殊之處在於只能被繼承,不能被實例化。

抽象類的作用:

如果說類是從一堆對象中抽取相同的內容而來的,那麽抽象類就是從一堆類中抽取相同的內容而來的,內容包括數據屬性和函數屬性,

從設計角度去看,如果類是從現實對象抽象而來的,那麽抽象類就是基於類抽象而來的。

從實現角度來看,抽象類與普通類的不同之處在於:抽象類中只能有抽象方法(沒有實現功能),該類不能被實例化,只能被繼承,且子類必須實現抽象方法。

如果一組類中有相似的方法,為了方便使用可以使用抽象類將這些相似的方法定義到抽象類中,好像形成了一個接口,統一了這些相似的方法。

import abc   # 使用abc模塊實現抽象類


class All_file(metaclass=abc.ABCMeta):   # 定義一個抽象類
    all_type = "file"
    
    @abc.abstractmethod      # 裝飾器的作用是實現抽象方法,無需實現功能
    def read(self):   # 方法在子類中實現
        pass
    
    @abc.abstractmethod
    
def 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類的三大特性---多態