2014-01-18 44 views
2

我最近与Python又开始只有特定值的数据类型,我试图写到哪很多种类的以下问题发生模块:寻找能够容纳

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

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

我看到这可能与我定义的unitClass类继承到女儿类inchesClass,millimetersClassmetersClass的对象。然后我会创建每个实例,以便用户可以分配给有问题的变量。但我认为这可能会令人困惑,除非这是解决这个问题的标准方法吗?

我提出的另一个解决方案是设置方法,但由于我没有将它们用于其他变量,所以如果可能的话,我也想在这种情况下避免它们。

是否有另一种方法只使用标准python安装提供的模块来做到这一点?

问候,

RTT

+1

我们是在python 3还是python不是3? – BlackVegetable

+0

我想使它与2.7兼容,但它不是一个高优先级。 –

回答

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) 
+0

我想补充一点,'enum'只能在Python 3.4中添加,并且在大多数生产环境中几乎不可用。 – Cu3PO42

+0

@ Cu3PO42从__future__导入 –

+0

好点。我总是自己实施它,因为它真的不难做... – Cu3PO42

2

如果我理解正确的话,你想限制的OB的属性的可能值没有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因为变量不是类型VOR单身平时应以大写字母无法启动。

+0

我没有足够的声望来upvote,但这也有帮助。谢谢。 –