码迷,mamicode.com
首页 > 编程语言 > 详细

enum枚举

时间:2019-01-08 17:48:09      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:mos   names   one   for   bee   exist   __new__   ast   ssd   

1. EnumMeta

一旦Enum被定义,Enum类就是最终的;它不能与其他类型( int、float等)混合。如果它有继承的__new__除非定义了新__new__否则结果类将失败。
    @staticmethod
    def _get_mixins_(bases):
        """
        返回用于创建枚举成员的类型,以及第一个继承的类型枚举类。
        bases: the tuple of bases that was given to __new__  
        """
        if not bases:
            return object, Enum

        # double check that we are not subclassing a class with existing
        # enumeration members; while we're at it, see if any other data
        # type has been mixed in so we can use the correct __new__
        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
def __new__(metacls, cls, bases, classdict):
        member_type, first_enum = metacls._get_mixins_(bases)

enum枚举

标签:mos   names   one   for   bee   exist   __new__   ast   ssd   

原文地址:https://www.cnblogs.com/AIEIKE/p/10240225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!