假设我们模拟了出租车的运动。每辆车在任何给定的时间,只能处于idle, rebalancing, serving状态中的一种状态(就像我的模拟中有更多的情况)。在任何时候,我都要检查每一辆车的状况,并采取相应的行动。例如,如果车辆闲置,然后接载乘客,则其状态应从idle更改为serving。重要的是,在任何给定的时间,车辆只能处于这些状态之一,并且它的动作集也依赖于该状态。
目前,我使用的是一长串if-else检查,但感觉很天真,很难调试。例如,主逻辑首先检查汽车的状态:
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)然后这些函数中的任何一个都相应地更新其状态,所有这些都包括如下语句
self.idle = False
self.rebalancing = False
self.serving = True
self.time_idled = 0有很多重复和容易犯错误。
我想知道如果
发布于 2019-08-15 20:57:20
这是一个非常宽泛的问题,没有任何正确的答案。
但是要想有所帮助,为什么不使用类呢?
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' 然后,出租车需要做的任何功能都可以放在类中,例如:
def pickupPassengers():
if self.state != 'idle':
return
self.passengers += 1然后创建您的出租车并通过类管理它们。
taxi1 = Taxi()
taxi1.getPassengers()发布于 2019-08-15 21:00:10
有几种方法可以实现你想要的。因为如果每次发生状态更改时必须手动更改多个变量,则会变得很混乱.只有一个变量负责状态!如果您仍然希望能够引用Taxi.idle、Taxi.rebalancing等,那么您可以创建@property方法。在定义函数时,它们看起来很像函数,但它们被称为属性。
请参阅下面的Taxi类示例,该类只有一个状态变量self._state,并使用@property方法返回状态。
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}")```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发布于 2019-08-15 21:13:25
您的设计问题是,您试图使用一系列布尔值来实现离散变量(状态)的一种热编码。如果一次只想要一个值,那么自然的方法就是使用一个变量。枚举类型是大多数高级语言为此使用的。例如,您可以将“空闲”编码为0,将“再平衡”编码为1,等等。
Python代码如下所示:
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来处理。您所做的就是使用枚举名称作为值。正如您设计模型的那个方面一样,您可以编写代码。
https://stackoverflow.com/questions/57516074
复制相似问题