【发布时间】:2014-10-21 17:11:02
【问题描述】:
我的previous question 询问了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 值的一种非常重量级的方法。这种方法的另一个问题是,生成的整数值可能会根据定义的子类的顺序和数量而有所不同——这意味着它们不会是常量值,而这通常是枚举所需要的。
-
我也考虑过元类可以生成不一致的值。我想实现 StateMachine 模式而不仅仅是枚举。
-
目前还不清楚 StateMachine 模式如何能够避免值不一致的问题。此外,您无需使用
ABCMeta,无论是在此处还是在您发布给您自己的问题的答案中。 Python 中的抽象基类与 C++ 中的抽象基类不同。如果您坚持使用类来表示不同的 Enum 值——这是一种有问题的方法——可能只需要一个元类。 -
好的,谢谢,我已经删除了 ABCMeta,我想使用
ABCMeta可以停止意外地设置State类。我还注意到生成的枚举值可能不一致,所以在我的实际实现中,我已经注释掉了元类并明确指定了枚举。