我是Python的新手,我想知道我是否可以构建具有复杂结构的枚举,而不仅仅是原始类型。例如(伪代码):
error in if (inherits(x j dataframe ) && ncol(xj) 1l) x j - as.matrix(x j )
到目前为止,我只能找到提到字符串或整数的枚举的Python文档。
答案 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
具有x
和y
属性:
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 Enum
,enum34
backport和Advanced Enumeration (aenum
)图书馆的作者。
答案 1 :(得分:1)
您可以将它们声明为全局变量,例如BOTTOM_LEFT
,TOP_LEFT
,TOP_RIGHT
,BOTTOM_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)