当前位置: 首页 > 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.jsqmd.com/news/924202/

相关文章:

  • AtlasOS终极指南:3步打造高性能Windows系统优化方案
  • Midjourney Edits API 集成指南
  • 不用sklearn,手把手教你用Python和TF-IDF从零搭建垃圾邮件分类器(附完整代码)
  • 5个技巧:快速掌握Zotero Style插件的终极指南
  • 2026铣边机/坡口机厂家推荐榜:平板/封头/法兰加工设备TOP3厂家专业+技术+避坑全解析 - 资讯纵览
  • 如何在5分钟内掌握LOIC:开源网络压力测试工具的完整实战指南
  • CAJ转PDF在线转换器免费2026年完整指南|手把手教你快速转换
  • 为什么你的Mac需要智能应用清理工具?Pearcleaner的完整解决方案
  • Gemini精准营销方案:3天快速部署的7步标准化流程(附企业级配置模板)
  • 2026无锡黄金回收多少钱一克?靠谱商家推荐TOP3,全域免费上门秒到账 - 资讯纵览
  • Edge太‘热情’怎么办?实测Win10家庭版/专业版禁用IE跳转的保姆级教程
  • 免费AI视频增强神器:3分钟让模糊视频变高清的完整指南
  • 20252903 2025-2026-2 《网络攻防实践》第九周作业
  • Python特征工程基础
  • OpCore Simplify终极指南:5分钟快速构建OpenCore EFI配置
  • 【Gemini欺诈识别系统合规生死线】:GDPR+《反电信网络诈骗法》双框架下6类数据使用红线与审计通关清单
  • Prompt工程×Gemini双引擎启动,手把手教你写出高响应率提示词,3类行业模板即拿即用
  • 2026论文必藏降AI率网站大曝光:一键压到安全线谁最稳
  • SecureCRT 8.5安装激活避坑全记录:从下载到成功注册,我踩过的雷你别再踩
  • 1975B
  • 青州抽沙船厂家哪家好 - 舒雯文化
  • 基于Arduino的智能植物浇水系统:自适应阈值灌溉与物联网实践
  • 从房价预测到广告点击率:用LinearRegression的positive参数解决业务中的‘非负’约束问题
  • 2026 年6月天津继承律所深度测评,深耕家族财富传承 - 资讯纵览
  • 别再盲目点击“同意”!Gemini新版通知中隐藏的2个未声明数据共享接口(附检测脚本)
  • 电源厂 ToMES 用户使用说明书_v4
  • 一键删除Gemini账户?别信!真实流程需完成这6项强制验证,第4步90%用户忽略
  • 如何3分钟获取中小学电子课本?这款开源工具让你告别繁琐下载
  • 三大优化方案让老旧电视重获新生:mytv-android原生直播应用性能调优指南
  • 基于ESP32与BLE的摩托车智能通知显示系统DIY全攻略