具有复杂类型的Python枚举

时间:2016-06-07 11:41:52

标签: python enums complextype

我是Python的新手,我想知道我是否可以构建具有复杂结构的枚举,而不仅仅是原始类型。例如(伪代码):

error in if (inherits(x j dataframe ) && ncol(xj) 1l) x j - as.matrix(x j )

到目前为止,我只能找到提到字符串或整数的枚举的Python文档。

3 个答案:

答案 0 :(得分:5)

如果您希望Point与追踪角落的Enum分开,则需要将它们分开:

from enum import Enum

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return 'Point(%r, %r)' % (self.x, self.y)

class Corner(Enum):
    BottomLeft = Point(0, 0)
    TopLeft = Point(0, 100)
    TopRight = Point(100, 100)
    BottmRight = Point(100, 0)

这样做意味着每个enum都包含Point作为其值,但不是Point本身:

>>> Corner.BottomLeft
<Corner.BottomLeft: Point(0, 0)>
>>> Corner.BottomLeft.value
Point(0, 0)

如果您希望enum成员 成为Point,请混合Point类:

from enum import Enum

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return 'Point(%r, %r)' % (self.x, self.y)

class Corner(Point, Enum):
    BottomLeft = 0, 0
    TopLeft = 0, 100
    TopRight = 100, 100
    BottmRight = 100, 0

>>> Corner.TopLeft
<Corner.TopLeft: (0, 0)>
>>> isinstance(Corner.TopLeft, Point)
True
>>> Corner.TopLeft.value
(0, 100)
>>> Corner.TopLeft.x
0
>>> Corner.TopLeft.y
100

最后,如果您只需要enum具有xy属性:

from aenum import Enum

class Corner(Enum):
    __init__ = 'x y'
    BottomLeft = 0, 0
    TopLeft = 0, 100
    TopRight = 100, 100
    BottmRight = 100, 0

>>> Corner.TopLeft
<Corner.TopLeft: (0, 100)>
>>> Corner.TopLeft.value
(0, 100)
>>> Corner.TopLeft.x
0
>>> Corner.TopLeft.y
100

请注意,最后一个示例使用的是aenum 1 。通过为enum类编写__init__,您可以使用enum34或stdlib Point完成相同的操作。

1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者。

答案 1 :(得分:1)

您可以将它们声明为全局变量,例如BOTTOM_LEFTTOP_LEFTTOP_RIGHTBOTTOM_RIGHT

正如您可能意识到的不同于Python没有的其他语言(C ++,Java),您只需声明它并且不要更改它(Gentleman的游戏)

然而,Alex Martelli的recipe可以方便地在Python中模拟const

答案 2 :(得分:0)

试试这个:

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Enum:
    bottom_left = Point(0, 0)
    top_left = Point(0, 100)
    top_right = Point(100, 100)
    bottom_right = Point(100, 0)