如何从枚举中动态创建函数变体?

时间:2018-04-19 08:35:47

标签: python function enums

假设有一个类定义了一些标准函数,其中一个是启动命令的函数。这里有两个例子:

Ser.Cmd(CmdEnum.MoveAbsolute,10,20,'Ack')
Ser.Cmd(CmdEnum.MoveRelative,5,0,'Ack')

其中CmdEnum.MoveAbsolute和CmdEnum.MoveRelative是要执行的特定命令的枚举值。

在本课程中还有其他"泛型"功能,如Ser.enable或Ser.getstatus。

如果命令的语法可能变为:

,则类的可用性会更加干净
Ser.MoveAbsolute(10,20,'Ack')

是否可以通过在对象创建期间传递枚举类型来创建此样式的函数?

有人能举个例子吗?

这个想法是没有部分" .MoveAbsolute"在类中硬编码,但是根据传递的枚举值指定。

2 个答案:

答案 0 :(得分:1)

您可以使用functools.partial功能。

import functools

class MySer(Ser):
    def __init__(self):
        self.MoveAbsolute = functools.partial(self.Cmd, CmdEnum.MoveAbsolute)
        self.MoveRelative = functools.partial(self.Cmd, CmdEnum.MoveRelative)

您现在可以调用这样的函数:

ser = MySer()
ser.MoveAbsolute(10, 20, 'Ack')

答案 1 :(得分:0)

您不需要枚举,因为您可以直接指明功能:

所以而不是:

Ser.Cmd(CmdEnum.MoveAbsolute,10,20,'Ack')
Ser.Cmd(CmdEnum.MoveRelative,5,0,'Ack')

可能会调用:

Ser.MoveAbsolute(10,20,'Ack')

你可以写:

Ser.Cmd(Ser.MoveAbsolute,10,20,'Ack')

Cmd的实施将是:

def Cmd(self, func, *args):
    func(*args)