有时候,一个对象有多种类型或形式。假设有一个按钮,有许多不同的拉伸输出(圆形按钮,复选按钮,方形按钮,按钮图像),但它们确实共享相同的操作逻辑“点击”: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!