状态机的实现

代码里我们经常会出现大量的条件判断,在这种情况下,我们可以实现状态机避免过度使用

有一种方式是把各种状态归为各种状态类

还有一种方式是修改实例的__class__属性

 1 """
 2 状态机的实现
 3 修改实例的__class__属性
 4 """
 5 
 6 
 7 class Connection:
 8     def __init__(self):
 9         self.new_state(CloseState)
10 
11     def new_state(self, state):
12         self.__class__ = state
13 
14     def read(self):
15         raise NotImplementedError
16 
17     def write(self, data):
18         raise NotImplementedError
19 
20     def open(self):
21         raise NotImplementedError
22 
23     def close(self):
24         raise NotImplementedError
25 
26 
27 class CloseState(Connection):
28     def read(self):
29         raise RuntimeError("Not Open")
30 
31     def write(self, data):
32         raise RuntimeError("Not Open")
33 
34     def open(self):
35         self.new_state(OpenState)
36 
37     def close(self):
38         raise RuntimeError("Already close")
39 
40 
41 class OpenState(Connection):
42     def read(self):
43         print("reading")
44 
45     def write(self, data):
46         print("writing")
47 
48     def open(self):
49         raise RuntimeError("Already open")
50 
51     def close(self):
52         self.new_state(CloseState)
53 
54 
55 if __name__ == "__main__":
56     c = Connection()
57     print(c)
58     c.open()
59     print(c)
60     c.read()
61     c.close()
62     print(c)

output:

  <__main__.CloseState object at 0x00000253645A1F10>
  <__main__.OpenState object at 0x00000253645A1F10>
  reading
  <__main__.CloseState object at 0x00000253645A1F10>

具体的应用场景目前我在工作中还没有用到,后面我得注意下

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:状态机的实现 - Python技术站

(0)
上一篇 2023年4月2日 下午4:13
下一篇 2023年4月2日 下午4:13

相关文章

  • 装饰器的多种实现方式

    一、基于函数实现   1、嵌套函数   代码实现: 1 from functools import wraps 2 3 4 def decorator(param): 5 def wrapper(func): 6 @wraps(func) 7 def verify(*args, **kwargs): 8 if param == ‘g’: 9 print(“&…

    Python开发 2023年4月2日
    00
  • 工匠回忆(三)

    接上文 7、函数   7.1、长度   7.2、圈复杂度   7.3、函数内代码确保处在同一抽象层内,主流程清晰,不存在穿插的分支   7.4、有状态的函数     7.4.1、全局变量     7.4.2、闭包函数     7.4.3、类     比较偏向于后两者   8、装饰器   装饰器和装饰器模式是两个完全不同的概念   1、三方模块wrapt的引入…

    python 2023年5月6日
    00
  • __call__用法简谈

      python一切皆对象,从是否可调用层面讲,对象又可以分为可调用对象、不可调用对象 在本篇中,类中实现__call__双下方法,即将该类的实例变为可调用对象   普通类未实现__call__的方法,实例是不可调用的,先看 1 class Valley: 2 … 3 4 5 if __name__ == ‘__main__’: 6 v = Valley…

    Python开发 2023年4月2日
    00
  • fastapi篇(一)

    fastapi是一个高性能的web开发框架 性能极高,可与 NodeJS, Go 媲美。(得益于Starlette和Pydantic)。 Starlette 是一个轻量级 ASGI 框架/工具包。它非常适合用来构建高性能的 asyncio 服务,并支持 HTTP 和 WebSockets。 官方网址:https://www.starlette.io/   P…

    python 2023年5月9日
    00
  • 线程锁在单例模式中的应用

    多个线程在执行过程中会因为竞争同一个资源而产生线程冲突,造成死锁,从而引出线程锁这个概念 先拿到锁再执行业务操作: 当然我对这一块了解的还不透彻,只是了解在不加锁的多线程情况下,会破坏单例模式,所以就有了下面这一段 1 import time 2 import threading 3 4 5 def decorator(func): 6 lock = thr…

    Python开发 2023年4月2日
    00
  • 方法的多种调用方式

      方法调用确实我们每个人都会,但是我觉得大家可能用的最多的就是那种常规的方式,这里呢,我要记录一下另外几种方式 1 from operator import attrgetter 2 from operator import methodcaller 3 4 5 class Valley: 6 def func(self): 7 print(“测试方法”)…

    Python开发 2023年4月2日
    00
  • 命名元组

    1、命名元组也叫具名元组   可以通过名称来访问序列中的元素,摆脱对位置的依赖,他本身是一个工厂函数 2、应用1   实例化元组返回的类,其内存占用要比普通类实例要小的多,因为前者实例的属性不通过字典进行管理 1 from collections import namedtuple 2 3 # 返回可实例化的类 4 P = namedtuple(“人”, […

    Python开发 2023年4月2日
    00
  • 生成器的反向验证

    生成器是一种特殊的迭代器,也可以说其父类型是迭代器   1、迭代器其实也有很多点要清楚,这里先不做赘述   2、要清楚,迭代器调用iter()返回的是自身 1 def func(s, e): 2 “”” 3 生成器函数 4 :param s:起始值 5 :param e: 末值 6 :return: 7 “”” 8 num = s 9 while num &…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部