<p>可以使用实例<a href="https://stackoverflow.com/a/19300424/28154">here</a>所示的属性定义枚举。如果内置枚举可以满足我的需要,我会避免定义自己的元类-下面是一个非常粗糙的Poc:</p>
<pre><code>"""Enums Poc"""
import enum
_ALL_LABELS = set() # TODO find a way to encapsulate into Label
class Label(enum.Enum):
def __new__(cls, *args, **kwds):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, *spellings):
_ALL_LABELS.add(self)
self.spellings = spellings
class PeriodLabel(Label):
def __init__(self, months, *spellings):
super().__init__(*spellings)
self.months = months
class Entity(enum.Enum):
class MONTH(Label): # better use 'Month' here
JANUARY = ['jan.', 'january']
FEBRUARY = ['febr.', 'february']
...
class PERIOD(PeriodLabel):
QUARTER = 3, ['q1', 'q2', 'q3', 'a4']
HALFYEAR = 6, ['q1', 'q2', 'q3', 'a4']
assert Entity.PERIOD == Entity['PERIOD']
assert Entity.MONTH == Entity['MONTH']
def some_function(entity_name, label_name, spellings):
print(f"{entity_name}-{label_name}:{spellings}")
# example 1
for entity in Entity:
entity_name = entity.name
for label in entity.value: # TODO: directly iterate (not in .value)
label_name = label.name
some_function(entity_name, label_name, label.spellings)
# example 2 (given entity_name, label_name as strings)
entity_name = 'PERIOD'
entity = Entity[entity_name]
label = entity.value['QUARTER']
if entity is Entity.PERIOD:
if label.months == 3:
print('True')
</code></pre>