如何在Python中从一组可能值中定义属性?

5
我希望初始化一个 User 类,其属性的值来自有限且不可变的可能值集合(例如,用户类型、国家的简短列表等)。在Python中,最佳方法是什么?
class User(object):
    def __init__(self, type, country):
        self.type = type # Possible values: [Consumer, Producer]
        self.country = country # Possible values: [UK, USA, Japan, France]

显而易见的是,我正式限制这组可能值的原因主要是为了避免/发现错误。

我查看了有关Python中listEnum的各种解释(例如,如何在Python中实现枚举),但考虑到我的需求,我不确定这是否是正确的方法。特别是,从我所读到的内容来看,Enum用于存储一组常量(例如将User.type存储为CONSUMERPRODUCER)......但我想直接在输出中使用这些值(所以大写字母看起来很奇怪)。而且我不确定每个值的数字等价物(例如CONSUMER=1...)对我是否有用。

编辑:我应该补充说明一下,我的应用程序中的真实值是用法语表示的,因此包括非ASCII字符(例如États-Unis)。采用Enum的方式似乎无法保留这些字符,并且意味着需要将该值“翻译”为“本地化”值,这对于一个短列表来说似乎是很麻烦的。


1
在您的情况下,我会使用List,如果您不知道关键字,只需进行简单的搜索即可。 - Anthony
1个回答

5
首先,您打算如何将États-Unis变成一个变量呢?把它放在列表里吗?无论如何,枚举是一个不错的选择。
为了限制选择,对传递的参数UserTypeCountry进行验证是一个好办法。
其次,您可以直接比较枚举,例如COUNTRY.US == COUNTRY.UK #返回False,所以枚举的实际值并不重要。
如果您仍然想检索值,那么可以从Country.US.value中获取它。
class Country(Enum):
    US = 'États-Unis'
    UK = 'Royaume-Uni'


class UserType(Enum):
    CONSUMER = 1
    PRODUCER = 2


class User(object):
    def __init__(self, type, country):
        if not isinstance(type, UserType):
            raise Exception
        self.type = type # Possible values: [Consumer, Producer]

        if not isinstance(country, Country):
            raise Exception
        self.country = country # Possible values: [UK, USA, Japan, France]




==> Country.UK == Country.US
==> False

==> print(Country.US.value)
==> 'États-Unis'

太好了!谢谢!我不知道我可以为每个“Enum”键分配文本值!小澄清:我想我需要导入“Enum”模块,是吗?从“enum”,“enum34”,“aenum”中导入? - iNyar
没错,我想是 from enum import Enum。如果你感兴趣的话,该模块中还有其他高级枚举类型,请查看 Enum 文档 - Kashif Siddiqui
请勿使用"type",因为这会掩盖内置函数。你的IDE应该已经警告了你。 - jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接