Если вы хотите 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
s, чтобы иметь атрибуты 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
, который был создан и поддерживается автором бэкпорта enum34
. Вы можете сделать то же самое либо с enum34
, либо с stdlib enum
, написав __init__
для класса Point
.
Нет ограничений по типу, а также в строках Python и ints являются «сложными типами». – pvg
В Python нет примитивных типов –
ОК, их нет, еще 1 или «бла» отличаются от (0,0) :-) – zakmck