一般而言枚举类型enum.Enum会对取值范围进行固定,这种类型一旦被定义就无法进行扩展,甚至不能以继承方式的变相扩展。但是由于业务的可扩展性需要,也存在需要对enum.Enum进行扩展的业务需求。这个时候可以通过一些不太正式的方式扩展枚举类型。
"""Python"""
# noinspection PyProtectedMember
def extend_to_enum(enum, extend_dict):
"""
扩展枚举类项目
:params enum: Enum 枚举类型
:params extend_dict: dict 追加的项目和值的字典
:return: None
"""
# 先做 key, value的唯一性校验
if (
extend_dict.keys() & enum._member_map_.keys() or
extend_dict.values() & enum._value2member_map_.keys()
):
raise ValueError('extend_dict:{} is invalid'.format(extend_dict))
# 追加枚举项目
for key, val in extend_dict.items():
# 实例化枚举对象,enum.__new__ 是被重写过的,
# 所以直接使用 object.__new__ 加赋值的方式实现
v = object.__new__(enum)
v.__objclass__ = enum
v._name_ = key
v._value_ = val
# 将枚举对象加入枚举类型的映射表里
enum._member_map_[key] = v # 名字对应对象的字典
enum._member_names_.append(key) # 名字列表
enum._value2member_map_[val] = v # 值对应对象的字典
网友评论