状态机的实现

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

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

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

添加新评论