首页 > 其他分享 >状态机的实现

状态机的实现

时间:2022-12-19 11:02:15浏览次数:24  
标签:__ raise 实现 self 状态机 state class def

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

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

还有一种方式是修改实例的__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>

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

 

标签:__,raise,实现,self,状态机,state,class,def
From: https://www.cnblogs.com/shixiaogu/p/16991646.html

相关文章

  • Java如何实现自定义异常
    自定义异常概述为什么需要自定义异常类:我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己......
  • CAS实现SSO单点登录原理
    一、不落俗套的开始1、背景介绍单点登录:SingleSignOn,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS框架:CAS(CentralAuthenti......
  • 教你用JavaScript实现推荐滑块
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个推荐滑块。推荐滑块展示内容,每隔3秒自动变换。案例演示运行程序后......
  • python多线程实现爬虫任务
    python语言对于网络爬虫来说是非常重要的,大多数互联网公司都热衷于python语言编写爬虫。那么如果大批量做爬虫工作,如何才能快速的爬取数据,这就需要多线程多任务操作才能快速......
  • Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路
    端口:8888,方便起见直接读取配置文件,生产环境可以读取git。application-dev.properties为全局配置。先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取。consu......
  • 教你用JavaScript实现表情评级
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个表情评价程序。用户打星进行评价,表情会根据具体星星数量发生变化......
  • MyBatis实现增删改查
    目录新建项目准备相关配置新建包和相关类增删改查实现根据id查询用户根据密码和名字查询用户给数据库增加一个用户修改用户的信息根据id删除一个用户小结模糊语句新建项目......
  • ASP.NET 实现验证码以及刷新验证码的小例子
    原文链接:https://www.jb51.net/article/42219.htm实现代码///<summary>   ///生成验证码图片,保存session名称VerificationCode   ///</summary>   pu......
  • ASP.NET验证码实现代码(C#)
    原文链接:https://www.jb51.net/article/13634.htm1、创建空白页面CheckCode.aspxpublicpartialclassCheckCode:System.Web.UI.Page{privatevoidPage_Load(......
  • ASP.NET中的几种弹出框提示基本实现方法
    原文链接:https://www.jb51.net/article/35046.htmprotectedvoidPage_Load(objectsender,EventArgse){Button1.Attributes.Add("onclick","returnconfirm('......