有時候,一個對象有多種類型或形式。假設有一個按鈕,有許多不同的拉伸輸出(圓形按鈕,複選按鈕,方形按鈕,按鈕圖像),但它們確實共享相同的操作邏輯“點擊”:onClick()。訪問使用相同的方法。這種思想稱為:多態。
多態是基於希臘詞Poly (多)和態(形式)。我們將創建一個可以采用或使用許多形式的對象的結構。
多態性函數在Python中使用:
我們創建兩個類:熊(Bear)和狗(Dog),它們各自有一個獨特的聲音。然後,我們創建兩個實例,並用同樣的方法調用它們看看它們各自的作用。
class Bear(object): def sound(self): print "Groarrr" class Dog(object): def sound(self): print "Woof woof!" def makeSound(animalType): animalType.sound() bearObj = Bear() dogObj = Dog() makeSound(bearObj) makeSound(dogObj)
結果輸出:
Groarrr Woof woof!
多態性與抽象類(最常用)
如果創建了一個編輯器,你事先可能不知道什麼類型的文件,用戶打開(PDF格式或word格式?)。 它不會有很大的訪問,取代的是每個文檔有20個類型?for document in documents: print document.name + ': ' + document.show()
要做到這一點,我們創建了一個抽象類:document。這個類冇有任何實現但定義結構(功能型),所有形式必須具備。如果我們定義函數 show(),那麼這兩個 PdfDocument 和 WordDocument 必須擁有 show()函數。全部代碼如下:
class Document: def __init__(self, name): self.name = name def show(self): raise NotImplementedError("Subclass must implement abstract method") class Pdf(Document): def show(self): return 'Show pdf contents!' class Word(Document): def show(self): return 'Show word contents!' documents = [Pdf('Document1'), Pdf('Document2'), Word('Document3')] for document in documents: print document.name + ': ' + document.show()
輸出結果:
Document1: Show pdf contents! Document2: Show pdf contents! Document3: Show word contents!
我們有一個抽象的接入點(文檔),以多種類型的對象(pdf,word)遵循相同的結構。
另一個例子是有一個抽象類:Car 保持該結構方法:drive() 和 stop()。 我們定義兩個對象:Sportscar 和 Truck,它們都是 Car 的一種形式。在偽代碼是需要做的是:
class Car: def drive abstract, no implementation. def stop abstract, no implementation. class Sportscar(Car): def drive: implementation of sportscar def stop: implementation of sportscar class Truck(Car): def drive: implementation of truck def stop: implementation of truck
然後我們就可以訪問任何類型的汽車,並調用其功能,而無需考慮形式是跑車(Sportscar )或卡車(Truck)。全部代碼:
class Car: def __init__(self, name): self.name = name def drive(self): raise NotImplementedError("Subclass must implement abstract method") def stop(self): raise NotImplementedError("Subclass must implement abstract method") class Sportscar(Car): def drive(self): return 'Sportscar driving!' def stop(self): return 'Sportscar breaking!' class Truck(Car): def drive(self): return 'Truck driving slowly because heavily loaded.' def stop(self): return 'Truck breaking!' cars = [Truck('Bananatruck'), Truck('Orangetruck'), Sportscar('Z3')] for car in cars: print car.name + ': ' + car.drive()
結果輸出:
Bananatruck: Truck driving slowly because heavily loaded. Orangetruck: Truck driving slowly because heavily loaded. Z3: Sportscar driving!