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!