Python 多型性
有時,物件有多種型別或形式。如果我們有一個按鈕,有許多不同的繪圖輸出(圓形按鈕、檢查按鈕、方形按鈕、帶影象的按鈕等),但它們共享相同的邏輯:onClick()
。我們使用相同的方法訪問它們。這個想法叫做多型。
多型性基於希單詞 Poly
(許多)和 morphism
(形式)。我們將建立一個可以採用或使用多種形式物件的結構。
具有函式的多型性:
我們創造了兩個類: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
格式或 txt
格式?)。
像這樣訪問他們是不是很好?
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 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!