前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 枚举类源码解析

Python 枚举类源码解析

作者头像
py3study
发布2020-01-19 17:26:10
5690
发布2020-01-19 17:26:10
举报
文章被收录于专栏:python3python3

1. EnumMeta

元类编程,生成类的类,可以动态生成类。 用法: type(name, bases, dict) name -> 类名: str bases -> 基类: tuple dict -> 属性: dict EnumMeta元类是用于生成Enum类,后续类都继承Enum类。

代码语言:javascript
复制
    class EnumMeta(type):
        def __new__(metacls, cls, bases, classdict):
            # member_type    枚举成员的类型
            # first_enum        第一个继承的类型枚举类
            member_type, first_enum = metacls._get_mixins_(bases)    
            .......
代码语言:javascript
复制
_get_mixins_方法
代码语言:javascript
复制
    @staticmethod
    def _get_mixins_(bases):
        """
        返回用于创建枚举成员的类型,以及第一个继承的类型枚举类。
        """
        # 这里是Enum(metaclass=Enum)时用到的,bases=()
        if not bases:
            return object, Enum

        # 继承自Enum类的子类,由以下方法判断
        member_type = first_enum = None
        for base in bases:
            if  (base is not Enum and
                    issubclass(base, Enum) and
                    base._member_names_):
                raise TypeError("Cannot extend enumerations")
        # base is now the last base in bases
        if not issubclass(base, Enum):
            raise TypeError("new enumerations must be created as "
                    "`ClassName([mixin_type,] enum_type)`")

        # get correct mix-in type (either mix-in type of Enum subclass, or
        # first base if last base is Enum)
        if not issubclass(bases[0], Enum):
            member_type = bases[0]     # first data type
            first_enum = bases[-1]  # enum type
        else:
            for base in bases[0].__mro__:
                # most common: (IntEnum, int, Enum, object)
                # possible:    (<Enum 'AutoIntEnum'>, <Enum 'IntEnum'>,
                #               <class 'int'>, <Enum 'Enum'>,
                #               <class 'object'>)
                if issubclass(base, Enum):
                    if first_enum is None:
                        first_enum = base
                else:
                    if member_type is None:
                        member_type = base

        return member_type, first_enum
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. EnumMeta
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档