Python 枚举类源码解析
程序员文章站
2022-04-04 14:40:31
1. EnumMeta 元类编程,生成类的类,可以动态生成类。 用法: type(name, bases, dict) name 类名: str bases 基类: tuple dict 属性: dict EnumMeta元类是用于生成Enum类,后续类都继承Enum类。 _get_mixins_方 ......
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
推荐阅读
-
python命令行参数解析OptionParser类用法实例
-
从源码解析Python的Flask框架中request对象的用法
-
深入源码解析Python中的对象与类型
-
python定义类self用法实例解析
-
spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理
-
python实现AutoResetEvent类的阻塞模式方法解析
-
Java并发之ReentrantLock类源码解析
-
Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)
-
从源码解析Python的Flask框架中request对象的用法
-
Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)