我最近又开始使用Python,我正在尝试编写一个模块,其中会发生以下类型的大量问题:
对象Problem
可以包含变量Unit
。单位只能是“英寸”,“毫米”或“米”。
该模块应该被其他人使用,所以我想要最容易使用的解决方案。如果可能,我希望用户在尝试分配除这些值之外的任何内容时收到错误。
我认为这对于我定义继承到子类unitClass
,inchesClass
和millimetersClass
的{{1}}类的对象是可能的。然后我会创建每个用户可以分配给相关变量的实例。但我认为这可能会令人困惑,除非这是解决这个问题的标准方法吗?
我提出的另一个解决方案是设置方法,但由于我不将它们用于其他变量,所以我希望在这种情况下尽可能避免使用它们。
还有另一种方法可以使用标准python安装提供的模块吗?
此致
RTT
答案 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
,因为非单身类型的变量通常不应以大写字母开头。