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

iNy*_*yar 4 python initialization

我想初始化一个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]
Run Code Online (Sandbox Code Playgroud)

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

我已经查看了 Python上listEnumPython中的各种解释(例如,如何在 Python 中实现枚举),但我不确定考虑到我的需求,这是否是正确的方法。特别是,从我读过的内容来看,似乎Enum是存储一个常量列表(User.typeasCONSUMERPRODUCER)......但我希望能够直接在输出中使用这些值(所以大写看起来很奇怪)。而且我不确定每个值是否有等价的数字(CONSUMER=1 ...) 的对我有用。

编辑:我可能应该补充一点,我的应用程序中的实际值是法语,因此包括非 ASCII 字符(例如,États-Unis)。走这Enum条路似乎无法保留这些字符,并且意味着然后将值“转换”为“本地化”值,这在我看来对于一个简短的列表来说很麻烦。

Kas*_*qui 5

首先,你是怎么想出一个变量的États-Unis?列个清单?无论如何,枚举是一个很好的方法,

要限制选择,请为传递的参数添加验证UserTypeCountry

其次,您可以直接比较枚举,例如COUNTRY.US == COUNTRY.UK #returns 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'
Run Code Online (Sandbox Code Playgroud)