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!