python设计模式(十三):解释器模式
此前已经将创造型模式、结构性模式分享了,后面将分享模式设计中的另一种典型模式:行为型模式。
创造型模式是解决实体的生成问题、结构性模式是为了解决实体的组合、搭配问题 ,而行为型设计模式的出现是为了解决不同实体通信的问题。
解释器模式:开发者自定义一种“有内涵”的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作。这种模式被用在 SQL 解析、符号处理引擎等
解释器模式要实现两个核心角色:
终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
# -*- coding:utf-8 -*-import timeimport datetime
"""实现一段简单的中文编程"""
class Code:"""自定义语言"""def __init__(self, text=None):self.text = text
class InterpreterBase:"""自定义解释器基类"""def run(self, code):pass
class Interpreter(InterpreterBase):"""实现解释器方法,实现终结符表达式字典"""def run(self, code):code = code.textcode_dict = {'获取当前时间戳': time.time(), "获取当前日期": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}print(code_dict.get(code))
if __name__ == '__main__':test = Code()test.text = '获取当前时间戳'data1 = Interpreter().run(test)test.text = '获取当前日期'data2 = Interpreter().run(test)
-----------------1550156061.11817072019-02-14 22:54:21
上面是个很简单的案例,同时我们也可以增加不同语言和不同的功能。
主要解决:对于一些固定文法构建一个解释句子的解释器。
何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
应用实例:编译器、运算表达式计算。
优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。
缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。
但实际上该模式的应用场景比较少
python设计模式(十三):解释器模式相关推荐
- Python设计模式:解释器模式
设计模式十三:解释器模式 什么是解释器模式 主要放向:让非初级用户和领域专家使用一门简单的语言来表达想法 一般是高级用户才会有所兴趣. 典型案例 音乐演奏者是现实中解释器模式的例子, 五线谱图形化地表 ...
- python实现解释器_Python设计模式之解释器模式
解释器模式 对每个应用来说,至少有以下两种不同的用户分类. 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就足够了. 高级用户:这些用户, ...
- Python设计模式-装饰器模式
Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...
- Python设计模式-中介者模式
Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...
- Python设计模式-职责链模式
Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...
- Python设计模式-享元模式
Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- python策略模式包含角色_详解Python设计模式之策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...
- java 设计模式之解释器模式(十九)
java 设计模式之解释器模式①⑨ 定义 角色分析 使用场景 代码实现 躁动的心灵,不安的灵魂.在彷徨中挣扎,在迷失中探索.时光飞逝,努力不变. 设计模式学习,近期我会把23种设计模式都写成博客,敬请 ...
- 北风设计模式课程---解释器模式(Interpreter Pattern)
北风设计模式课程---解释器模式(Interpreter Pattern) 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用 ...
最新文章
- 3.Tomact部署webapp
- delphi7下调用微软的Web Services的心得
- ArcGIS 10.x属性表乱码问题解决办法
- 实现一个压缩Remoting传输数据的Sink:CompressionSink (转载)
- 计算机专业很不稳定,浅谈计算机网络专业教学的创新因素:引起计算机系统不稳定的因素有哪些...
- INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113
- 什么使软件程序员成为专业人士?
- WebLogic 控制台乱码
- Leetcode 30.串联所有单词的子串
- ASP.NET页面的生命周期(转载)
- 449.序列化和反序列化二叉搜索树
- 专访尹毅(法师Seay):少年成名,野路子的奇妙逆袭 - FreeBuf.COM | 关注黑客与极客...
- 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(九)第一个程序背后的C语言知识
- java定时器表达式_Java Quartz表达式每分钟执行1次
- 利用python进行TEQC质量检核结果绘图
- 51nod 巧克力 1429
- c++ double 截取_c++ double 截取_C/C++ double取余函数
- 一键批量替换文本工具
- 《Ensemble Learning Methods for Deep Learning Neural Networks》笔记
- 墨者学院PHP,墨者学院SQL注入解题
热门文章
- kvm安装及虚拟机创建
- 启用WebApi 2里的Api描述信息(Help下的Description)
- (纪录片)统计的乐趣 The Joy of Stats (2010)
- 保险业尚不能完全发挥CRM优势 需强化
- 操作无法完成.键入的打印机名不正确,或者指定的打印机没有连接到服务器上.有关详细信息,请单帮助...
- php 偷偷转移别人权重,判断百度蜘蛛偷偷进行301转移权重 给新站提权
- java中组件与容器_java中的容器组件和非容器组件
- Python自学路线图之Python进阶
- 文件服务器搭建 xp,xp文件服务器搭建
- 一键移植工具_【产品推广】让UI设计畅通无阻 — 信息系统人机界面增强工具(HFE Designer)...