Python 枚举类源码解析

1. EnumMeta

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

    class EnumMeta(type):
        def __new__(metacls, cls, bases, classdict):
            # member_type    枚举成员的类型
            # first_enum        第一个继承的类型枚举类
            member_type, first_enum = metacls._get_mixins_(bases)    
            .......
_get_mixins_方法
    @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

转载于:https://www.cnblogs.com/AIEIKE/p/10240225.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值