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

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

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

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