2016-06-07 2 views
3

Я новичок в Python, и мне интересно, могу ли я создавать перечисления со сложными структурами, а не только примитивным типом. Например (в псевдокоде):Перечисления Python со сложными типами

Point::Enum 
    x, y 
    constructor (x, y) { 
    ... 
    } 

    bottom_left = Point (0, 0) 
    top_left = Point (0, 100) 
    top_right = Point (100, 100) 
    bottom_right = Point (100, 0) 

До сих пор я только мог найти Python документации упоминается перечисления со строками и Интсом.

+1

Нет ограничений по типу, а также в строках Python и ints являются «сложными типами». – pvg

+0

В Python нет примитивных типов –

+0

ОК, их нет, еще 1 или «бла» отличаются от (0,0) :-) – zakmck

ответ

1

Если вы хотите 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.

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) 
1

Вы можете объявить их как глобальные переменные, как BOTTOM_LEFT, TOP_LEFT, TOP_RIGHT, BOTTOM_RIGHT.

Как вы могли бы знать, в отличие от других языков (C++, Java) Python не имеют, Вы просто декларируют его и не изменяют его (Джентльменский игра)

Но Алекс Мартелли-х recipe может пригодиться для имитации Const в Python

Смежные вопросы