关于python中Enum的个人总结

  1. 初识

    1. 可以通过enum模块导入
  2. 语法

    1. 初始化:

      • 可以通过enum_ = Enum('class_name', names,start = 1)来创建,其中names可以是字符串,可以是列表/元组。内部定义为:
       def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1):
      """Convenience method to create a new Enum class. `names` can be: * A string containing member names, separated either with spaces or
      commas. Values are incremented by 1 from `start`.
      * An iterable of member names. Values are incremented by 1 from `start`.
      * An iterable of (member name, value) pairs.
      * A mapping of member name -> value pairs. """
      metacls = cls.__class__
      bases = (cls, ) if type is None else (type, cls)
      _, first_enum = cls._get_mixins_(bases)
      classdict = metacls.__prepare__(class_name, bases) # special processing needed for names?
      if isinstance(names, str):
      names = names.replace(',', ' ').split()
      if isinstance(names, (tuple, list)) and names and isinstance(names[0], str):
      original_names, names = names, []
      last_values = []
      for count, name in enumerate(original_names):
      value = first_enum._generate_next_value_(name, start, count, last_values[:])
      last_values.append(value)
      names.append((name, value)) # Here, names is either an iterable of (name, value) or a mapping.
      for item in names:
      if isinstance(item, str):
      member_name, member_value = item, names[item]
      else:
      member_name, member_value = item
      classdict[member_name] = member_value
      enum_class = metacls.__new__(metacls, class_name, bases, classdict) # TODO: replace the frame hack if a blessed way to know the calling
      # module is ever developed
      if module is None:
      try:
      module = sys._getframe(2).f_globals['__name__']
      except (AttributeError, ValueError, KeyError) as exc:
      pass
      if module is None:
      _make_class_unpicklable(enum_class)
      else:
      enum_class.__module__ = module
      if qualname is not None:
      enum_class.__qualname__ = qualname return enum_class

      通过这样就可以初始化并返回一个枚举类。

      1. 关于Enum的元素的使用

        • 通过源码可知:可以通过:enum_(value).vlaue/name,或者sth = enum.name-->sth.name/value,至于为什么,需要查看源码:

        • class DynamicClassAttribute:
          """Route attribute access on a class to __getattr__. This is a descriptor, used to define attributes that act differently when
          accessed through an instance and through a class. Instance access remains
          normal, but access to an attribute through a class will be routed to the
          class's __getattr__ method; this is done by raising AttributeError. This allows one to have properties active on an instance, and have virtual
          attributes on the class with the same name (see Enum for an example). """
          def __init__(self, fget=None, fset=None, fdel=None, doc=None):
          self.fget = fget
          self.fset = fset
          self.fdel = fdel
          # next two lines make DynamicClassAttribute act the same as property
          self.__doc__ = doc or fget.__doc__
          self.overwrite_doc = doc is None
          # support for abstract methods
          self.__isabstractmethod__ = bool(getattr(fget, '__isabstractmethod__', False)) def __get__(self, instance, ownerclass=None):
          if instance is None:
          if self.__isabstractmethod__:
          return self
          raise AttributeError()
          elif self.fget is None:
          raise AttributeError("unreadable attribute")
          return self.fget(instance) def __set__(self, instance, value):
          if self.fset is None:
          raise AttributeError("can't set attribute")
          self.fset(instance, value) def __delete__(self, instance):
          if self.fdel is None:
          raise AttributeError("can't delete attribute")
          self.fdel(instance) def getter(self, fget):
          fdoc = fget.__doc__ if self.overwrite_doc else None
          result = type(self)(fget, self.fset, self.fdel, fdoc or self.__doc__)
          result.overwrite_doc = self.overwrite_doc
          return result def setter(self, fset):
          result = type(self)(self.fget, fset, self.fdel, self.__doc__)
          result.overwrite_doc = self.overwrite_doc
          return result def deleter(self, fdel):
          result = type(self)(self.fget, self.fset, fdel, self.__doc__)
          result.overwrite_doc = self.overwrite_doc
          return result

          需要先实例化才能使用。

  3. 结语

    最后,Enum不仅可以是一个好的枚举也可以拿来代替一些繁琐的类、状态、顺序等东西。比如说:`life = Enum('life', 'born baby teenager adult older die')。

    当然,更多的秘密等着你们自己去挖掘。

关于python中Enum的个人总结的更多相关文章

  1. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  2. Python 中的枚举类型~转

    Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...

  3. Python中的枚举

    在Python中想要实现枚举功能的方式比较多,可以通过字典这一数据结构,利用键与值的对应关系,可以实现枚举的功能. my_Enum={ 'red':1, 'yellow':2, 'blue':3 } ...

  4. Python中使用枚举类

    开发中我们经常定义常量, 其实有更好的方法:为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例.Python中提供了Enum类来实现这个功能: from enum im ...

  5. python 枚举Enum

    常量是任何一门语言中都会使用的一种变量类型 如 要表示星期常量,我们可能会直接定义一组变量 JAN = 1 TWO = 2 ... 然后在返回给前端的时候,我们返回的就会是1,2,...这种魔法数字, ...

  6. 数据库MySql在python中的使用

    随着需要存储数据的结构不断复杂化,使用数据库来存储数据是一个必须面临的问题.那么应该如何在python中使用数据库?下面就在本篇博客中介绍一下在python中使用mysql. 首先,本博客已经假定阅读 ...

  7. Python IAQ中文版 - Python中少有人回答的问题

    Python中少有人回答的问题 The Python IAQ: Infrequently Answered Questions 1 Q: 什么是"少有人回答的问题(Infrequently ...

  8. Json schema 以及在python中的jsonschema

    目录 1. JSON Schema简介 2. JSON Schema关键字详解 2.1 $schema 2.2 title和description 2.3 type 3 type常见取值 3.1 当t ...

  9. sqlalchemy python中的mysql数据库神器

    在介绍sqlalchemy之前,我们先了解一下ORM. ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.也就是说ORM 将数据库中的表与面向对象语言中的类建 ...

随机推荐

  1. maven&nexus_repository 私库搭建与使用

    一.nexus仓库安装 1,http://www.sonatype.org/nexus/    下载sso版本,免费2,tar -zxvf nexus-2.11.1-01-bundle.tar.gz3 ...

  2. Goorm永久免费的VPS

    简介 咱在LOC(某知名主机论坛)看到的,当个容器玩玩还是不错的,不过10分钟后会休眠,目前还没有大佬可以解决,可以使用SSH连接,适合折腾,不适合建站等生产环境操作,请注意.https://www. ...

  3. 设计模式:Iterator模式

    目的:将数据的存储和数据的查询分开,降低数据的耦合性 继承关系图: 例子: //定义迭代器接口 template<typename T> class Iterator { public: ...

  4. Win10下ImageMagick及php-imageck扩展的安装

    安装ImageMagick https://imagemagick.org/script/download.php 选择符合自己电脑的版本进行安装即可.安装的时候注意勾选下面的选项自动加入环境变量,否 ...

  5. 让内层浮动的Div将外层Div撑开 -----清浮动

    清浮动的好处写多了都能体会到,解决高度塌陷, 一般情况下是要清除浮动的,不然会影响下面标签的排版. <div class="parent" style="width ...

  6. Day02_IP地址详解&进制转换&DOS基本命令与批处理

    学于千峰教育开源课程 感谢 千峰教育官网 b站在线视频 IP地址详解 一.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的局域网的设 ...

  7. Django学习路34_models 文件创建数据表

    from django.db import models # Create your models here. class BookInfoManager(models.Manager): '''图书 ...

  8. Django学习路22_empty为空,forloop.counter 从1计数,.counter0 从0计数 .revcounter最后末尾数字是1,.revcounter0 倒序,末尾为 0

    当查找的数据不存在,返回为 空时 在 html 中使用 {%empty%} 语句 进行显示 def getstudents(request): students = Student.objects.a ...

  9. PHP ftruncate() 函数

    定义和用法 ftruncate() 函数把打开文件截断到指定的长度. 如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 ftruncate(file,size) 参数 描述 file 必需 ...

  10. PHP password_get_info() 函数

    password_get_info() 函数用于返回指定散列(hash)的相关信息. PHP 版本要求: PHP 5 >= 5.5.0, PHP 7高佣联盟 www.cgewang.com 语法 ...