将选项常量作为参数传递给类

时间:2015-10-30 12:05:23

标签: python

我有一个Python类,它接受一个参数来设置一个对象的状态。此参数必须是可用选项列表中的一个选项;例如,红绿灯可以是红色,绿色或橙色。

我有两种方法来处理这个问题。我可以使用字符串来设置状态,但是我将不得不进行额外的错误检查,如果不查看代码可用的状态,则不清楚。或者,我可以创建一个充当枚举的类。

我应该使用以下哪种方法(或其他方法)?

字符串示例:

def function(a, b, c, d):
    code in function
code outside function

替代使用简单的“枚举”:

class Light(object): 
    def __init__(self, color):
        self.color = color

    def turn_on(self):
        if self.color == 'red':
            self.turn_on_red_light()
        if self.color == 'green':
            self.turn_on_green_light()
        if self.color == 'orange':
            self.turn_on_orange_light()

    def turn_on_red_light():
        # do stuff
        return

    def turn_on_green_light():
        # do stuff
        return

    def turn_on_orange_light():
        # do stuff
        return

light = Light('red')
light.turn_on()

也许这不是最好的例子,因为你可以只调用class Colors(object): red, green, orange = range(3) class Light(object): def __init__(self, color): self.color = color def turn_on(self): if self.color == Colors.red: self.turn_on_red_light() # as above if self.color == Colors.green: self.turn_on_green_light() # as above if self.color == Colors.orange: self.turn_on_orange_light() # as above light = Light(Colors.red) light.turn_on() ,但是那个决定要调用哪个函数的逻辑必须位于其他地方。让我们假装这不是一种选择。

我经常遇到这种情况。我经常使用它来定义类中的“设置”。我有兴趣知道Python中的首选方法是什么,或者可以通过其他方式进行改进?

1 个答案:

答案 0 :(得分:2)

简单地接受字符串非常受欢迎,然后在传递错误字符串时中断。通常,您描述的“设置”是作为常量提供的,但是,如您的示例中所示,它们只是指向您可以发送的内容,例如0表示红色。

例如,Tkinter有几个引用字符串的常量,例如tkinter.END'end'tkinter.S's',依此类推。使用Tkinter的程序员可以交替执行text.get('1.0', tkinter.END)text.get('1.0', 'end')之类的操作。

如果您愿意,请提供此类常量,但请记住,它们不一定会被使用 - 人们可能更喜欢使用更简洁的0而不是Colors.red - 或者,对于Tkinter示例, 'nsew'超过tkinter.N + tkinter.S + tkinter.E + tkinter.W。因此,我建议让常量指向一个易于理解的字符串,如'red'表示红色,如果你选择使常量可用。如果你发现省略这些常数更容易和更易于维护,那就没有错。