状态机的实现
代码里我们经常会出现大量的条件判断,在这种情况下,我们可以实现状态机避免过度使用
有一种方式是把各种状态归为各种状态类
还有一种方式是修改实例的__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>
具体的应用场景目前我在工作中还没有用到,后面我得注意下