python - 在 Python 中以类实例作为参数调用方法

标签 python

假设我有以下代码

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/

相关文章:

python - 将 bool 值传递给 Python C 扩展的 "correct"方法是什么?

python - 数组列表中存在数组

python - 如何更改深度未知且递归生成的无序列表的颜色?

python - 在 Bokeh 中显示所选内容的文本注释

python - 压缩具有重复项的 Python 频率列表(可能带有推导式)

python - 如何在 python 中使用 wordpress REST api 上传图像?

python - 如何将日、月、年转换成日期格式?

python - OpenCV 3.0缺少诸如drawMatches和drawMatchesKNN的方法

python - 报告实验室。具有两列的 float 文本

python - 类函数不返回正确的值