假设我有以下代码
IDLE = 0
STARTED = 1
STOPPED = 2
ERRORED = 3
# additional states as needed
class StateMachine:
def __init__(self)
self.state = IDLE
def start(self):
self.state = STARTED
# do something
def stop(self):
self.state = STOPPED
# do something
def reset(self):
self.state = IDLE
# do something
我们当前的界面允许客户端通过声明所需的目标状态来更改实例的状态,此时我们运行某些验证检查,然后运行适当的方法。理想情况下,我希望将所需目标状态的字典映射保留到正确的方法,以避免大量且无意义的 if 语句 block 。即
if target_state = STARTED:
instance.start()
elif target_state = STOPPED:
instance.stop()
...
但我不确定以下解决方案是否被认为是好的做法(使用实例作为 arg 从类调用方法感觉有点古怪)。
state_mapping = {
IDLE: StateMachine.reset,
STARTED: StateMachine.start,
....
}
然后调用使用:
action = state_mapping[target_state]
action(instance)
....
有什么想法吗?
最佳答案
不是那么古怪。
不过,唯一要注意的是action
是一个未绑定(bind)的方法,乍一看方法调用可能不是很明显;除了我直接知道该字典是如何定义的。
我认为更具可读性的替代方法是从实例调用方法:
state_mapping = {
IDLE: "reset",
STARTED: "start",
....
}
action = state_mapping[target_state]
getattr(instance, action)()
当方法接受多个参数时,这同样会提高可读性。
关于python - 在 Python 中以类实例作为参数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654885/