假设,我有一个预先存在的映射作为字典:
value_map = {'a': 1, 'b': 2}
我可以这样创建枚举类:
^{pr2}$像这样使用它
a = MyEnum.a
print(a.value)
>>> 1
print(a.name)
>>> 'a'
但是我想为我的新enum类定义一些方法:
def double_value(self):
return self.value * 2
当然,我可以这样做:
class MyEnum(Enum):
a = 1
b = 2
@property
def double_value(self):
return self.value * 2
但正如我所说,我必须使用一个预定义的值映射字典,所以我不能这样做。 如何做到这一点?我试图从另一个类继承这个方法,就像mixin一样,但是我无法理解。在
您可以创建一个从
enum.EnumMeta
(枚举的元类)派生的新元类(使用元元类或工厂函数,如下所示),并在创建类之前添加成员另一种解决方案是直接尝试并更新
^{pr2}$locals()
,因为当您试图赋值时,它会被一个创建枚举值的映射所取代。在这似乎定义得足够好,}相同,但在未来可能会发生变化。第一个解决方案更健壮,也不那么麻烦(我还没有在其他Python实现中测试过,但它的工作原理可能是一样的)
a = 1
很可能与{可以使用
type
参数将带有mixin方法的基类型传递到函数API中:{{1}你永远不能在cd2中创建一个完全使用的函数方法:
^{pr2}$您也可以使用
enum.EnumMeta()
元类,就像Python创建class MyEnum(enum.Enum): ...
子类时一样:enum.EnumMeta
使用的自定义dictionary子类并不是为了方便重用而设计的;它实现了一个__setitem__
钩子来记录元数据,但不会覆盖dict.update()
方法,因此在使用value_map
字典时,我们需要小心:然后将
double_value=property(double_value)
传递给该函数(连同枚举名和value_map
字典):否则,您可以创建不带成员的枚举的子类(任何descriptor都不是成员,因此函数、属性、类方法等等),因此您可以先定义不带成员的枚举:
对于函数API(例如
enum.Enum(..., type=DoubledEnum)
)和我编码为enum_with_extras()
的元类方法,它都是可接受的基类。在相关问题 更多 >
编程相关推荐