我有一个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中的首选方法是什么,或者可以通过其他方式进行改进?
答案 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'
表示红色,如果你选择使常量可用。如果你发现省略这些常数更容易和更易于维护,那就没有错。