首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保变量在任何给定时间只处于一种状态。

确保变量在任何给定时间只处于一种状态。
EN

Stack Overflow用户
提问于 2019-08-15 20:47:47
回答 3查看 107关注 0票数 0

假设我们模拟了出租车的运动。每辆车在任何给定的时间,只能处于idle, rebalancing, serving状态中的一种状态(就像我的模拟中有更多的情况)。在任何时候,我都要检查每一辆车的状况,并采取相应的行动。例如,如果车辆闲置,然后接载乘客,则其状态应从idle更改为serving。重要的是,在任何给定的时间,车辆只能处于这些状态之一,并且它的动作集也依赖于该状态。

目前,我使用的是一长串if-else检查,但感觉很天真,很难调试。例如,主逻辑首先检查汽车的状态:

代码语言:javascript
复制
    if self.should_move():


        _ = _make_a_decision(t)
        self.update_rebalancing(WARMUP_PHASE)



    if self.is_busy():
        self.keep_serving()

    elif self.is_waiting_to_be_matched():
        # it's sitting somewhere
        self.keep_waiting()




    elif self.rebalancing:  # and not self.busy:
        self.update_rebalancing(WARMUP_PHASE)

然后这些函数中的任何一个都相应地更新其状态,所有这些都包括如下语句

代码语言:javascript
复制
    self.idle = False
    self.rebalancing = False
    self.serving = True
    self.time_idled = 0

有很多重复和容易犯错误。

我想知道如果

  1. 对于这种情况,有一个编程模式。
  2. 如果Python特别具有处理这种情况的功能
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-15 20:57:20

这是一个非常宽泛的问题,没有任何正确的答案。

但是要想有所帮助,为什么不使用类呢?

代码语言:javascript
复制
class Taxi:
    # One variable to hold an enum of the states.
    self.state = 'idle'

    # function to update the state
    def setState(self, state):
        self.state = state

    # Functions to check the state (could have one to get the state and check later
    def isIdle(self):
        return self.state == 'idle' 

然后,出租车需要做的任何功能都可以放在类中,例如:

代码语言:javascript
复制
    def pickupPassengers():
        if self.state != 'idle':
            return

        self.passengers += 1

然后创建您的出租车并通过类管理它们。

代码语言:javascript
复制
taxi1 = Taxi()
taxi1.getPassengers()
票数 1
EN

Stack Overflow用户

发布于 2019-08-15 21:00:10

有几种方法可以实现你想要的。因为如果每次发生状态更改时必须手动更改多个变量,则会变得很混乱.只有一个变量负责状态!如果您仍然希望能够引用Taxi.idleTaxi.rebalancing等,那么您可以创建@property方法。在定义函数时,它们看起来很像函数,但它们被称为属性。

请参阅下面的Taxi类示例,该类只有一个状态变量self._state,并使用@property方法返回状态。

代码语言:javascript
复制
class Taxi:
    def __init__(self, initial_state = "idle"):
        self._state = initial_state


    @property
    def idle(self):
        return self._state == "idle"

    @property
    def rebalancing(self):
        return self._state == "rebalancing"

    @property
    def serving(self):
        return self._state == "serving"

    def serve(self):
        print("\nChanging state to serving\n")
        self._state = "serving"

T = Taxi() # Initialize taxi

print(f"Taxi is idle: {T.idle}")
print(f"Taxi is rebalancing: {T.rebalancing}")
print(f"Taxi is serving: {T.serving}")

T.serve()

print(f"Taxi is idle: {T.idle}")
print(f"Taxi is rebalancing: {T.rebalancing}")
print(f"Taxi is serving: {T.serving}")```
代码语言:javascript
复制
Output:

Taxi is idle: True
Taxi is rebalancing: False
Taxi is serving: False

Changing state to serving

Taxi is idle: False
Taxi is rebalancing: False
Taxi is serving: True
票数 1
EN

Stack Overflow用户

发布于 2019-08-15 21:13:25

您的设计问题是,您试图使用一系列布尔值来实现离散变量(状态)的一种热编码。如果一次只想要一个值,那么自然的方法就是使用一个变量。枚举类型是大多数高级语言为此使用的。例如,您可以将“空闲”编码为0,将“再平衡”编码为1,等等。

Python代码如下所示:

代码语言:javascript
复制
from enum import Enum, unique, auto    

@unique
class TaxiState(Enum):

    IDLE  = auto()
    REBAL = auto()
    SERVE = auto()


class Taxi():

    def __init__(self):
        self.state = TaxiState.IDLE 

    def is_busy(self):
        return self.state != TaxiState.IDLE

您不必担心编码,而是由auto来处理。您所做的就是使用枚举名称作为值。正如您设计模型的那个方面一样,您可以编写代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57516074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档