Python设计模式编程中解释器模式的简单程序示例分享


Posted in Python onMarch 02, 2016

模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

我们来看一下下面这样的程序结构:

class Context:
  def __init__(self):
    self.input=""
    self.output=""

class AbstractExpression:
  def Interpret(self,context):
    pass

class Expression(AbstractExpression):
  def Interpret(self,context):
    print "terminal interpret"

class NonterminalExpression(AbstractExpression):
  def Interpret(self,context):
    print "Nonterminal interpret"

if __name__ == "__main__":
  context= ""
  c = []
  c = c + [Expression()]
  c = c + [NonterminalExpression()]
  c = c + [Expression()]
  c = c + [Expression()]
  for a in c:
    a.Interpret(context)

那么它所体现出的类图是这样的:

Python设计模式编程中解释器模式的简单程序示例分享

再来看一个例子:

#encoding=utf-8 
# 
#by panda 
#解释器模式 
 
def printInfo(info): 
  print unicode(info, 'utf-8').encode('gbk'), 
 
#上下文类:演奏内容 
class PlayContext(): 
  text = None 
  PlayText = None 
 
#抽象表达式类 
class Expression(): 
  def Interpret(self, context): 
    if len(context.PlayText) == 0: 
      return 
    else: 
      playKey = context.PlayText[0:1] 
      context.PlayText = context.PlayText[2:] 
      tmp = context.PlayText.index(' ') #找出第一个空格出现的位置 
      playValue = context.PlayText[0:tmp] 
      context.PlayText = context.PlayText[tmp+1:] 
      self.Excute(playKey,playValue) 
   
  def Excute(self,playKey,playValue): 
    pass 
 
#音高 
class Pitch(Expression): 
  pitch = None 
  def Excute(self, key, value): 
    value = int(value) 
    if value == 1: 
      self.pitch = '低音' 
    elif value == 2: 
      self.pitch = '中音' 
    elif value == 3: 
      self.pitch = '高音' 
    printInfo(self.pitch) 
     
#音符 
class Note(Expression): 
  Notes = { 
  'C':1,   
  'D':2, 
  'E':3,   
  'F':4,   
  'G':5,   
  'A':6,   
  'B':7,   
  } 
  note = None 
  def Excute(self, key, value):    
    self.note = self.Notes[key] 
    printInfo('%d' % self.note) 
 
 
def clientUI(): 
  context = PlayContext() 
  context.PlayText = "O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 " 
  expression = None; 
  while(len(context.PlayText) > 0): 
    str = context.PlayText[0:1]; 
    if(str == 'O'): 
      expression = Pitch() 
    elif(str == 'C' or str == 'D' or str == 'E' or str == 'F' or str == 'G' or str == 'A' or str == 'B' or str == 'P'): 
      expression = Note() 
    expression.Interpret(context) 
       
  return 
 
if __name__ == '__main__': 
  clientUI();

类图:

Python设计模式编程中解释器模式的简单程序示例分享

Python 相关文章推荐
python操作sqlite的CRUD实例分析
May 08 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
django自带的server 让外网主机访问方法
May 14 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
Python运行异常管理解决方案
Mar 09 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Python 转移文件至云对象存储的方法
Feb 07 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
用Python可视化新冠疫情数据
Jan 18 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 #Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 #Python
Python随机生成带特殊字符的密码
Mar 02 #Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 #Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 #Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 #Python
深入解析Python设计模式编程中建造者模式的使用
Mar 02 #Python
You might like
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
JavaScript中链式调用之研习
2011/04/07 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python图像常规操作
2017/11/11 Python
python实现维吉尼亚算法
2019/03/20 Python
Python enumerate内置库用法解析
2020/02/24 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
MYSQL基础面试题
2012/05/13 面试题
高中生活自我鉴定
2014/01/18 职场文书
原告代理词范文
2015/05/25 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python