STUNUM

面有萌色,胸有丘壑。心有猛虎,细嗅蔷薇。

嗨,我是王鑫 (@stunum),一名 Python 开发者。


Python web开发,后端以Django框架为主,前端使用Vue.js...

python设计模式之解释器模式

解释器模式

意义:

开发者自定义一种“有内涵”的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作。这种模式被用在 SQL 解析、符号处理引擎等

解释器模式要实现两个核心角色:
  • 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
  • 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
    举例:

    ``` import time import datetime

#实现一段简单的中文编程 class Code(object): #自定义语言 def init(self, text=None): self.text = text

class InterpreterBase(object): #自定义解释器基类 def run(self, code): pass

class Interpreter(InterpreterBase): #实现解释器方法,实现终结符表达式字典 def run(self, code): code = code.text code_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.1181707 2019-02-14 22:54:21 ```

最近的文章

python设计模式之模板方法模式

模板方法模式意义:定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容;在模板思想下,实体的整体框架是确定的,他是一个模板,但是模板下内容可变,从而实现了动态的更新流程或算法。适用性: 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke 和Johnson所描述过的“重分解以一般化”的一个很好的例子[ OJ93 ]。首先识别现有代码中的...…

水滴石穿继续阅读
更早的文章

python设计模式之享元模式

享元模式意义:运用共享技术有效地支持大量细粒度的对象。适用性: 一个应用程序使用了大量的对象。 完全由于使用大量的对象,造成很大的存储开销。 对象的大多数状态都可变为外部状态。 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。 应用程序不依赖于对象标识。由于Flyweight 对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。 举例: ```class FlyweightBase(object): def offer(self): ...…

水滴石穿继续阅读