当前位置: 首页 > news >正文

Python状态机模式

# Python 状态机模式 (State Machine)
# State 协议,FSM 类,状态转换,进入/退出动作,守卫条件
# 状态机将对象行为封装在不同状态中,状态变化时行为随之改变。

from abc import ABC, abstractmethod
from typing import Callable

# 状态接口
class State(ABC):
@abstractmethod
def on_enter(self, fsm: "OrderFSM") -> None: ...
@abstractmethod
def on_exit(self, fsm: "OrderFSM") -> None: ...
@abstractmethod
def handle(self, fsm: "OrderFSM", event: str) -> None: ...

# 具体状态
class PendingState(State):
def on_enter(self, fsm: "OrderFSM") -> None:
fsm.order.status = "pending"
def on_exit(self, fsm: "OrderFSM") -> None: pass
def handle(self, fsm: "OrderFSM", event: str) -> None:
if event == "pay":
fsm.transition_to(PaidState())
elif event == "cancel":
fsm.transition_to(TerminalState("cancelled"))

class PaidState(State):
def on_enter(self, fsm: "OrderFSM") -> None:
fsm.order.status = "paid"
def on_exit(self, fsm: "OrderFSM") -> None: pass
def handle(self, fsm: "OrderFSM", event: str) -> None:
if event == "ship":
fsm.transition_to(ShippedState())
elif event == "refund":
fsm.transition_to(TerminalState("refunded"))

class ShippedState(State):
def on_enter(self, fsm: "OrderFSM") -> None:
fsm.order.status = "shipped"
def on_exit(self, fsm: "OrderFSM") -> None: pass
def handle(self, fsm: "OrderFSM", event: str) -> None:
if event == "deliver":
fsm.transition_to(TerminalState("delivered"))

class TerminalState(State):
def __init__(self, status: str):
self._status = status
def on_enter(self, fsm: "OrderFSM") -> None:
fsm.order.status = self._status
def on_exit(self, fsm: "OrderFSM") -> None: pass
def handle(self, fsm: "OrderFSM", event: str) -> None: pass

# 守卫条件
class Guard:
def __init__(self, condition: Callable[[], bool]):
self._condition = condition
def passes(self) -> bool:
return self._condition()

# 有限状态机
class Order:
status: str = "pending"

class OrderFSM:
def __init__(self, order: Order):
self.order = order
self._current: State = PendingState()
self._guards: dict[tuple[type, str], Guard] = {}
def add_guard(self, st: type, evt: str, g: Guard) -> None:
self._guards[(st, evt)] = g
def transition_to(self, new: State) -> None:
self._current.on_exit(self)
self._current = new
self._current.on_enter(self)
def handle(self, event: str) -> None:
g = self._guards.get((type(self._current), event))
if g and not g.passes():
raise RuntimeError("守卫阻止了转换")
self._current.handle(self, event)

if __name__ == "__main__":
order = Order(); fsm = OrderFSM(order)
fsm.handle("pay"); print(f"状态: {order.status}")
fsm.handle("ship"); print(f"状态: {order.status}")
fsm.handle("deliver"); print(f"终态: {order.status}")

http://www.gsyq.cn/news/1435529.html

相关文章:

  • Midjourney Edits API 集成指南
  • 2026铣边机/坡口机厂家推荐榜:平板/封头/法兰加工设备TOP3厂家专业+技术+避坑全解析 - 资讯纵览
  • 为什么你的Mac需要智能应用清理工具?Pearcleaner的完整解决方案
  • CAJ转PDF在线转换器免费2026年完整指南|手把手教你快速转换
  • 2026无锡黄金回收多少钱一克?靠谱商家推荐TOP3,全域免费上门秒到账 - 资讯纵览
  • Python特征工程基础
  • 青州抽沙船厂家哪家好 - 舒雯文化
  • 基于Arduino的智能植物浇水系统:自适应阈值灌溉与物联网实践
  • 一键删除Gemini账户?别信!真实流程需完成这6项强制验证,第4步90%用户忽略
  • 紧急!Gemini API调用量突增237%背后的3个隐蔽攻击指纹——附Python自动化检测脚本(限24小时免费领取)
  • 如何一键解密QQ音乐加密文件:QMCDecode音频格式转换实战指南
  • Android逆向工程终极指南:用Androguard轻松掌握APK分析技术
  • Python滑动窗口算法
  • FUXA实战:工业流程管道动画制作全流程指南
  • 2026手把手教你PDF转CSV!工具+在线方法全套教程
  • Windows 11优化神器:用Win11Debloat一键打造纯净高效系统
  • 终极指南:如何在Windows上优雅使用BiliBili-UWP第三方客户端
  • Altium Designer PCB设计全流程:从原理图到生产文件的实战指南
  • 如何高效构建现代化电子签名功能:Signature Pad专业开发指南
  • 基于RP2040 Pico的125Msps任意波形发生器:DMA与PIO硬件加速实战
  • 服务网格Istio实战与微服务治理
  • 从光敏电阻到物联网:手把手教你制作智能酒精消毒提醒器
  • 如何用.NET Windows Desktop Runtime轻松部署Windows桌面应用?终极解决方案来了!
  • 2026终极测评:16款降AIGC软件测评,闭眼入这款就对了! - 降AI小能手
  • Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
  • MASA模组全家桶汉化包:让中文玩家轻松掌握顶级Minecraft工具
  • 在Ubuntu 20.04上为CARLA 0.9.14手动打上鱼眼相机补丁(附编译避坑指南)
  • 2026 年郑州GEO代运营公司盘点:五家AI服务商深度解析 - 资讯纵览
  • 如何用.NET Windows Desktop Runtime彻底告别部署噩梦?完整实战指南
  • 如何快速部署开源自动化工具:5个实用技巧让你轻松玩转鸣潮游戏