My previous question спросил о Enum в питонаPython метаклассом генерировать правильные значения перечислений для класса
Допустим, я создаю государственные классы:
class State(object):
"""
Abstract class representing a state.
"""
enum = 1
def __init__(self, instance):
self.instance = instance
def is_flag(self, flag):
return flag & self.enum == self.enum
А потом я создаю различные фактические государства
class New(State):
enum = 2
def pay(self):
...
class Paid(State):
enum = 4
def complete(self):
...
class Completed(State):
enum = 8
ACCOUNTABLE = Paid.enum | Completed.enum
В то время как это работает, я хотел бы автоматизировать генерацию значений перечисления, и кажется, что это можно сделать, используя классы Meta, вопрос в том, как?
Абстрактные базовые классы - это не одно и то же, что и метаклассы. Несмотря на это, создание отдельных классов с атрибутом, содержащим единственное целочисленное значение, похоже на ужасно тяжелый подход к созданию значений Enum. Другая проблема с этим подходом заключается в том, что генерируемые целочисленные значения могут варьироваться в зависимости от порядка и количества определенных подклассов, что означает, что они не будут постоянными значениями, что часто желательно для перечислений. – martineau
Я также рассмотрел, что несогласованные значения могут быть сгенерированы метаклассом. Я хочу реализовать шаблон StateMachine, а не только Enum. –
Непонятно, как шаблон StateMachine позволит избежать проблемы несогласованных значений. Кроме того, ваше использование 'ABCMeta' не нужно, как здесь, так и в ответе, который вы отправили на свой вопрос. В базовых классах Python абстрактные базовые классы - это не то же самое, что они, например, в C++. Если вы настаиваете на том, чтобы использовать классы для представления разных значений Enum - сомнительный подход - метакласс, вероятно, все, что вам нужно. – martineau