美文网首页
Python中enum.Enum的扩展

Python中enum.Enum的扩展

作者: slords | 来源:发表于2019-04-01 15:12 被阅读0次

一般而言枚举类型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  # 值对应对象的字典

相关文章

网友评论

      本文标题:Python中enum.Enum的扩展

      本文链接:https://www.haomeiwen.com/subject/ljrmbqtx.html