Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发
在SmartFile中,在工程生活方面我们已经习惯了使用很多非常棒的技术使得开发工作更加迅速并且可控(参考开放闭合原则)。通过使用一些简单的模式,我们可以避免开发的应用遇到一些常见的设计问题如刻板,脆弱,固定和粘性;因此,这会让我们的未来处于一种更加开心的状态。
我们经常使用的一种技术就是多态。在讨论Python的多态技术之前,我们先来看一下这个词原本的涵义:
多态这个词实际上可以划分成两个单独的希腊字母根。第一个就是Poly,就是多于一个的意思。下一个就是Morph,它是指具有多种形态。因此,在某种抽象层面上,我们可以假设多态是指处于具有多种类型的对象平行线上的东西;在软件层面上,我们可以认为这是一种使用单个通用接口来操作具有相似特性数据的能力。
用例
起初,多态可能是个比较难以理解的概念。所以除了刚才的定义之外,我们来看一下它被实际使用的一些例子。你知道所有的轿车都有四个门,一个引擎和四个车轮,但是却有非常多不同类型的轿车;同理,你也有很多不同类型的银行账户(活期,储蓄,商业等),以及很多不同类型的权限(读,写)。你可能想用一个单独的数组来保存这些不同类型的命令或对象。
代码时间
场景:我们需要创建一个包含了从我们商店购买汽车的用户清单,然后打印出他们的名字。
对于一些软件设计的新人来说,他们可能会认为下面的代码就能满足需求:
people = ['John', 'Chris', 'Justin', 'Kyle',]
for person in people:
print person
输出:
John
Chris
Justin
Kyle
很棒!但是它虽然工作了却并不是很“多态”。如果我们想要清单上每个条目的更详细信息呢?也许我们想要每个汽车的最高时速,以及每个汽车类型的概述呢?有一种简单的实现就是把需要的数据以字符串连接的方式拼接起来,不过这会导致每个条目包含的字符串越来越长。下面我们会从面向对象的角度,用多态的方法来实现它。
首先,我们知道每个司机都购买了汽车。因此,我们可以创建一个基本类型,这个基类将用拥有者的名字来初始化,另外,我们也会实现get_owner和top_speed方法。
# Base Vehicle:
class Vehicle:
# Constructor
def __init__(self, owner):
self.owner = owner
def get_owner(self):
return self.owner
# Methods in which every subclass will be required to implement.
def top_speed(self):
raise NotImplementedError("Subclass is missing its top speed method.")
注释:如果你对C++比较了解的话,这里的top_speed函数其实就是一种“纯虚函数”
现在我们来创建一些基本的类型:
# Vehicles:
class Truck(Vehicle):
def top_speed(self):
return "The truck has a top speed of 120mph."
class Sedan(Vehicle):
def top_speed(self):
return "The sedan has a top speed of 140mph.”
class SportsCar(Vehicle):
def top_speed(self):
return "The sports car has a top speed of 200mph."
现在再创建一个包含了这些类型的对象列表:
vehicles = [
Truck("Chris"),
Sedan("Kyle"),
Sedan("Justin"),
SportsCar("John"),
]
这其实就是一个多态的列表。虽然它们都具有相似的类型,但是每一个都是不同的。现在我们可以迭代地访问每个对象,并且查询它的最高时速!不要被重写函数所迷惑,这并不是本文所要讲解的。本文主要的内容就是理解如何在更高的抽象层次去操作不同类型的实例。
for vehicle in vehicles:
print(vehicle.get_owner())
print(" * " + str(vehicle.top_speed()))
输出:
Chris
* The truck has a top speed of 120mph.
Kyle
* The sedan has a top speed of 140mph.
Justin
* The sedan has a top speed of 140mph.
John
* The sports car has a top speed of 200mph.
Python中多态的思考
你会发现,使用多态会增加实际的代码量。但是,我们却创建了一个能被操作的可扩展类型,摆脱了之前在python中使用字符串分割(split)或者正则表达式等带来的负担。同时我们很容易就能在类中增加更多的属性。多态是一个非常基础的概念,也是其他设计模式的基础。实际上,我们在本文中已经引入了一些设计模式:模板方法模式和门面模式。
我本人非常鼓励你在这个概念的基础上去学习更多不同类型的设计模式,同时也建议你去实际地创建并执行一下这些模式,因为它真的能对你喜欢的编程语言做个知识的检验。
英文原文:http://www.smartfile.com/blog/polymorphic-python/
译者:dlgao