Python 多型性

有時,物件有多種型別或形式。如果我們有一個按鈕,有許多不同的繪圖輸出(圓形按鈕、檢查按鈕、方形按鈕、帶影象的按鈕等),但它們共享相同的邏輯:onClick()。我們使用相同的方法訪問它們。這個想法叫做多型

多型性基於希單詞 Poly(許多)和 morphism(形式)。我們將建立一個可以採用或使用多種形式物件的結構。

具有函式的多型性:

我們創造了兩個類:BearDog,兩者都可以叫出聲音。然後我們建立兩個例項並使用相同的方法呼叫它們的操作。

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 格式或 txt 格式?)。

像這樣訪問他們是不是很好?

for document in documents:
    print document.name + ': ' + document.show()

為此,我們建立了一個名為 document 的抽象類。此類沒有任何功能實現,但定義了所有表單必須具有的結構(以函式的形式)。如果我們定義函式 show(),則 PdfDocumentWordDocument 都必須具有 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

然後,如果表格是 SportscarTruck,我們可以訪問任何型別的汽車並呼叫函式而無需進一步考慮。

完整程式碼:

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 braking!'
 
class Truck(Car):
    def drive(self):
        return 'Truck driving slowly because heavily loaded.'
 
    def stop(self):
        return 'Truck braking!'
 
 
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!