我很难在Python中找到OO Enum组合的例子。所以我想问下面的例子是否正确,还是更可取的pythonic方法?
我更喜欢声明 Enum 的类语法,但对于组合来说,似乎建议使用函数式 API。有什么方法可以使用类语法来做到这一点吗?
from enum import Enum
class Vertical(Enum):
Tall = 1
Short = 2
class Horizontal(Enum):
Slim = 1
Spacious = 2
composition = list(Vertical.__members__)
composition.extend(Horizontal.__members__)
Body = Enum('Body', composition)
你不能派生枚举,它们是"密封的":
class Body(Vertical): pass
导致TypeError: Cannot extend enumerations
.
如果你想让你组合的枚举比较相等,你可以使用 IntEnum
s:
from enum import IntEnum
class Vertical(IntEnum ):
Tall = 1
Short = 2
class Horizontal(IntEnum): # distinct int's
Slim = 3
Spacious = 4
composition = list(Vertical.__members__)
composition.extend(Horizontal.__members__)
Body = IntEnum('Body', composition)
用法:
print(Body.Tall == Vertical.Tall) # True
print(Body.Tall == 1) # Also True
本质上它归结为:你的枚举现在也是int的。不过,您需要注意不要为不同的概念使用相同的整数:
class Sizes(IntEnum):
Tiny = 1
print(Sizes.Tiny == Vertical.Tall) # True - but not really?