Python枚举类定义和使用

      最后更新:2022-07-29 09:07:19 手机定位技术交流文章

      一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个;再比如用一个类表示季节,则该类的实例化对象最多有 4 个。

      对于这个特定的类,Python 3.4添加了一个新的Enum排列类,换句话说,这些对象的实例数中固定的类可以由排列类定义。

      例如,下面的程序显示如何定义一个排列类:
      from enum import Enum
      class Color(Enum):
      #指定序列值的值
      red = 1
      green = 2
      blue = 3
      如果想将一个类定义为枚举类,只需要令其继承自 enum 模块中的 Enum 类即可。例如在上面程序中,Color 类继承自 Enum 类,则证明这是一个枚举类。

      在颜色排列类别中,红色、绿色和蓝色都是类的成员(可以理解的类变量)。注意,列举类的每个成员由两个部分组成,分别为 name 和 value,名称属性值是列举值的变量名称(例如红色),该值代表列举值的序列(序列通常以1开始)。

      和普通类的用法不同,枚举类不能用来实例化对象,但这并不妨碍我们访问枚举类中的成员。访问枚举类成员的方式有多种,例如以 Color 枚举类为例,在其基础上添加如下代码:
      #调用3种方法来列举成员
      print(Color.red)
      print(Color[‘red’])
      print(Color(1))
      #调取枚举成员中的 value 和 name
      print(Color.red.value)
      print(Color.red.name)
      #2个浏览排列类的所有成员的方法
      for color in Color:
      print(color)
      程序输出结果为:
      Color.red
      Color.red
      Color.red
      1
      red
      Color.red
      Color.green
      Color.blue

      不能比较列举的类成员的大小,但可以使用==或是比较它们是否等价,例如:
      print(Color.red == Color.green)
      print(Color.red.name is Color.green.name)
      输出结果为:
      Flase
      Flase

      需要注意的是,枚举类中各个成员的值,不能在类的外部做任何修改,也就是说,下面语法的做法是错误的:
      Color.red = 4

      除此之外,该枚举类还提供了一个members属性,该属性是一个包含枚举类中所有成员的字典,通过遍历该属性,也可以访问枚举类中的各个成员。例如:
      for name,member in Color.members.items():
      print(name,“->”,member)
      输出结果为:
      red -> Color.red
      green -> Color.green
      blue -> Color.blue

      值得一提的是,Python 枚举类中各个成员必须保证 name 互不相同,但 value 可以相同,举个例子:
      from enum import Enum
      class Color(Enum):
      #指定序列值的值
      red = 1
      green = 1
      blue = 3
      print(Color[‘green’])
      输出结果为:
      Color.red

      可以看到,Color 枚举类中 red 和 green 具有相同的值(都是 1),Python允许这种情况发生,它会将 green 当做是 red 的别名,所以当我访问绿党成员时,最后的输出是红色。

      在实际的编程过程中,如果你想避免这种情况,你可以使用@unique decorator,这样程序会报告一个valueError错误,当列举类的一个成员出现同一个值。 例如:
      # 介绍独一无二
      from enum import Enum,unique
      #添加一个独特的装饰
      @unique
      class Color(Enum):
      #指定序列值的值
      red = 1
      green = 1
      blue = 3
      print(Color[‘green’])
      运行程序会报错:
      Traceback (most recent call last):
      File “D:python3.6demo.py”, line 3, in
      class Color(Enum):
      File “D:python3.6libenum.py”, line 834, in unique
      (enumeration, alias_details))
      ValueError: duplicate values found in <enum ‘Color’>: green -> red

      除了通过继承Enum类创建一个排列类之外,Enum()函数还可以创建一个排列类。例如:
      from enum import Enum
      #创建一个枚举类
      Color = Enum(“Color”,(‘red’,‘green’,‘blue’))
      #调用3种方法来列举成员
      print(Color.red)
      print(Color[‘red’])
      print(Color(1))
      #调取枚举成员中的 value 和 name
      print(Color.red.value)
      print(Color.red.name)
      #2个浏览排列类的所有成员的方法
      for color in Color:
      print(color)
      Enum()函数接受两个参数,第一个是指定排列类的类名,第二个是指定排列类的多个成员。

      如上面所示,创建一个与以前的颜色类相同的编列类,仅通过一个代码行。 一个运行程序的输出结果是:
      Color.red
      Color.red
      Color.red
      1
      red
      Color.red
      Color.green
      Color.blue

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/30756.html

          热门文章

          文章分类