寻找能够仅保存特定值的数据类型

时间:2014-01-18 20:32:45

标签: python list switch-statement selection

我最近又开始使用Python,我正在尝试编写一个模块,其中会发生以下类型的大量问题:

对象Problem可以包含变量Unit。单位只能是“英寸”,“毫米”或“米”。

该模块应该被其他人使用,所以我想要最容易使用的解决方案。如果可能,我希望用户在尝试分配除这些值之外的任何内容时收到错误。

我认为这对于我定义继承到子类unitClassinchesClassmillimetersClass的{​​{1}}类的对象是可能的。然后我会创建每个用户可以分配给相关变量的实例。但我认为这可能会令人困惑,除非这是解决这个问题的标准方法吗?

我提出的另一个解决方案是设置方法,但由于我不将它们用于其他变量,所以我希望在这种情况下尽可能避免使用它们。

还有另一种方法可以使用标准python安装提供的模块吗?

此致

RTT

2 个答案:

答案 0 :(得分:3)

在其他语言(即java)中,这种结构称为enum或枚举。特别是因为你枚举了某些东西的可能值。

在python 3中,你可以导入枚举并像这样使用它:

from enum import Enum

class Color(Enum):

    red = 1
    green = 2
    blue = 3

这里有一篇更深入的帖子:How can I represent an 'Enum' in Python?

如果您想要一个如何将其扩展到特定情况的示例,我会这样做,通过创建一个单元枚举:

class Unit(Enum):
    inches, millimeters, meters = range(3)

class Problem(object):

    def __init__(self, units):
        self.unit = getattr(Unit(), units) 

答案 1 :(得分:2)

如果我理解正确,您希望在没有usimgna setter函数的情况下限制对象属性的可能值。在Python中,您可以使getter / setter的行为与通常的属性相同。你可以这样做:

class Problem(object):
    @property
    def unit(self):
        return self._unit

    @unit.setter
    def unit(self, val):
        if val in ["inches", "millimeters", "meters"]:
            self._unit = val

我更改了Unit,因为非单身类型的变量通常不应以大写字母开头。