当前位置: 首页 > 面试题库 >

Python状态机设计

唐俊英
2023-03-14
问题内容

您是否可以与我(和社区)分享的人对Python状态机的设计技巧?

目前,我将基于以下方面来选择引擎:

class TrackInfoHandler(object):
    def __init__(self):
        self._state="begin"
        self._acc=""

    ## ================================== Event callbacks

    def startElement(self, name, attrs):
        self._dispatch(("startElement", name, attrs))

    def characters(self, ch):
        self._acc+=ch

    def endElement(self, name):
        self._dispatch(("endElement", self._acc))
        self._acc=""

    ## ===================================
    def _missingState(self, _event):
        raise HandlerException("missing state(%s)" % self._state)

    def _dispatch(self, event):
        methodName="st_"+self._state
        getattr(self, methodName, self._missingState)(event)

    ## =================================== State related callbacks

但是我敢肯定,在利用Python的动态特性(例如动态调度)的同时,有很多解决方法。

我追求的是针对“引擎”的设计技术,该技术接收与基于机器“状态”的事件和“事件”相对的“事件”和“事件”。


问题答案:

我真的不明白这个问题。该 设计模式是相当清楚的。。

class SuperState( object ):
    def someStatefulMethod( self ):
        raise NotImplementedError()
    def transitionRule( self, input ):
        raise NotImplementedError()

class SomeState( SuperState ):
    def someStatefulMethod( self ):
        actually do something()
    def transitionRule( self, input ):
        return NextState()

这是非常常见的样板,可用于Java,C ++,Python(而且我敢肯定也可以使用其他语言)。

如果您的状态转换规则很琐碎,可以进行一些优化以将转换规则本身推入超类。

注意,我们需要有前向引用,因此我们通过名称引用类,并用于eval将类名称转换为实际的类。另一种方法是使转换规则实例变量代替类变量,然后在定义所有类之后创建实例。

class State( object ):
    def transitionRule( self, input ):
        return eval(self.map[input])()

class S1( State ): 
    map = { "input": "S2", "other": "S3" }
    pass # Overrides to state-specific methods

class S2( State ):
    map = { "foo": "S1", "bar": "S2" }

class S3( State ):
    map = { "quux": "S1" }

在某些情况下,您的事件并不像测试对象的相等性那么简单,因此更通用的转换规则是使用功能对象对的正确列表。

class State( object ):
    def transitionRule( self, input ):
        next_states = [ s for f,s in self.map if f(input)  ]
        assert len(next_states) >= 1, "faulty transition rule"
        return eval(next_states[0])()

class S1( State ):
    map = [ (lambda x: x == "input", "S2"), (lambda x: x == "other", "S3" ) ]

class S2( State ):
    map = [ (lambda x: "bar" <= x <= "foo", "S3"), (lambda x: True, "S1") ]

由于规则是按顺序评估的,因此允许使用“默认”规则。



 类似资料:
  • 问题内容: 我正在开始编写Java库以实现高性能的有限状态机。 我知道那里有很多库,但是我想从头开始编写自己的库,因为那里几乎所有的库都构造了自动机,每次只处理一个就优化了。 我想知道在实现这样的高性能库时,SO社区中涉足状态机设计的人们认为最重要/最好的设计原则。 注意事项 生成的自动机通常并不庞大。(〜100-500个州)。 该实现应该能够 扩展 。 该实现应支持 快速转换 (最小化,确定化等

  • 主要内容:实例,实例,实例,实例,实例,实例关键词:状态机,售卖机 有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。 状态机类型 Verilog 中状态机主要用于同步时序逻辑的设计,能够在有限个状态之间按一定要求和规律切换时序电路的状态。状态的切换方

  • 我想把GUI实现为一个状态机。我认为这样做有一些好处,也有一些缺点,但这不是这个问题的主题。 在读了一些关于这方面的文章后,我发现了几种用C语言建模状态机的方法,我坚持使用2,但我不知道哪种方法更适合GUI建模。 > 用以下方法将状态机表示为状态列表:

  • 概述 Javascript Finite State Machine函数库 参考链接 概述 有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 简单说,它有三个特征: 状态总数(state)是有限的。 任一时刻,只处在一种状态之中。 某种条件下,会从一种状态转变(transition)到另一种状态。 它对JavaScript的意义在于,很多对象可

  • 智能状态机是一个前端复杂对象优雅编程模型。 npm包中包含库和浏览器扩展 目的:更加自动和简洁的实现状态的迁移。 原理:通过装饰器,对异步函数进行包装,使得调用异步函数可以自动修改状态,并且自动实现异步调用过程中的中间状态 功能: 自动生成状态机 自动实现状态迁移 自动派发事件 可视化状态变化历史 可视化状态机图 使用例子: import { FSM, ChangeState } from 'af

  • 8. 状态(State) Intent 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。 Class Diagram Implementation 糖果销售机有多种状态,每种状态下销售机有不同的行为,状态可以发生转移,使得销售机的行为也发生改变。 // java public interface State { /** * 投入 25 分钱 */