Python 高手编程系列九百一十二:模板

模板(template)通过定义抽象步骤来帮助设计一个通用算法,这些抽象步骤由子
类来实现。这种模式使用里氏替换原则(Liskov substitution principle),在维基百科中这
样定义。
“如果 S 是 T 的子类型,则程序中类型 T 的对象可以用类型 S 的对象替换,
而无需改变该程序的任何期望属性。”
换句话说,抽象类可以通过在具体类中实现的步骤来定义算法如何工作。抽象类还可
以给出算法的基本或部分实现,并允许开发人员覆写其部分。例如,可以覆写队列模块中
的 Queue 类的一些方法以改变其行为。
让我们实现一个例子,如图 14-4 所示。
Indexer 是一个索引器类,它以 5 个步骤处理文本,这是无论使用任何索引技术都常
见的步骤。
• 文本规范化。
• 文本拆分。
• 去停用词。
• 抽取词干。
• 词频。
Indexer 提供了流程算法的部分实现,但是需要在子类中实现_remove_stop_words 和
_stem_words。BasicIndexer 实现最小必须的部分,而 LocalIndex 使用停用词
文件和词干数据库。FastIndexer 实现所有步骤,可以基于快速索引器,如 Xapian
或 Lucene。
一个简单实现如下:
from collections import Counter
class Indexer:
def process(self, text):
text = self._normalize_text(text)
words = self._split_text(text)
words = self._remove_stop_words(words)
stemmed_words = self._stem_words(words)
return self._frequency(stemmed_words)
def _normalize_text(self, text):
return text.lower().strip()
def _split_text(self, text):
return text.split()
def _remove_stop_words(self, words):
raise NotImplementedError
def _stem_words(self, words):
raise NotImplementedError
def _frequency(self, words):
return Counter(words)
从那里,一个 BasicIndexer 实现可以是如下所示:
class BasicIndexer(Indexer):
_stop_words = {‘he’, ‘she’, ‘is’, ‘and’, ‘or’, ‘the’}
def _remove_stop_words(self, words):
return (
word for word in words
if word not in self._stop_words
)
def _stem_words(self, words):
return (
(
len(word) > 3 and
word.rstrip(‘aeiouy’) or
word
)
for word in words
)
并且,和以往一样,这里是上面的示例代码的示例用法,如下所示:

indexer = BasicIndexer()
indexer.process(“Just like Johnny Flynn said\nThe breath I’ve taken
and the one I must to go on”)
Counter({“i’v”: 1, ‘johnn’: 1, ‘breath’: 1, ‘to’: 1, ‘said’: 1, ‘go’: 1,
‘flynn’: 1, ‘taken’: 1, ‘on’: 1, ‘must’: 1, ‘just’: 1, ‘one’: 1, ‘i’: 1,
‘lik’: 1})
对于可以变化并且可以被表示为独立的子步骤的算法,应当考虑模板。这可能是 Python中最常用的模式,并不总是需要通过子类来实现。例如,许多处理算法问题的内置 Python
函数接受允许将部分实现委托给外部实现的参数。例如,sorted()函数允许一个可选的
key 关键字参数,稍后由排序算法使用。在给定集合中找到最小值和最大值的 min()和
max()函数也是如此。
小结
针对软件设计的常见问题,设计模式是可复用的且有点语言相关的解决方案。对于所
有开发者来说,无论他们使用何种语言,设计模式都是必备修养。
因此,对于一种给定的语言,使用实现的例子来说明常用的模式,这是一种很好
的学习设计模式的方式。在 Web 开发以及其他开发的书籍中,你可以很容易找到 GoF
书中提到的每一个设计模式的实现。所以,我们只关注 Python 语言中最常见且最流行
的模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值