返回顶部
首页 > 资讯 > 后端开发 > Python >Python 枚举
  • 344
分享到

Python 枚举

Python 2023-01-31 02:01:31 344人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

1. 枚举的定义 首先,定义枚举要导入enum模块。 枚举定义用class关键字,继承Enum类。 用于定义枚举的class和定义类的class是有区别。 示例代码: from enum import Enum class

1. 枚举的定义

首先,定义枚举要导入enum模块。
枚举定义用class关键字,继承Enum类。
用于定义枚举的class和定义类的class是有区别。

示例代码:

from enum import Enum

class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indiGo = 6
    purple = 7

代码分析:

  1. 上面的代码,我们定义了颜色的枚举Color.
  2. 颜色枚举有7个成员,分别是Color.red、Color.orange、Color.yellow等。
  3. 每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
  4. 每个成员的数据类型就是它所属的枚举。【*注:用class定义的类,实际上就是一种类型】

1.1 定义枚举时,成员名称不允许重复

from enum import Enum

class Color(Enum):
    red = 1
    red = 2

上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: ‘red’

1.2 默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名

from enum import Enum

class Color(Enum):
    red = 1
    red_alias = 1

成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。

1.3 如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员

from enum import Enum

class Color(Enum):
    red = 1
    red_alias = 1

print(Color(1))

输出结果为:Color.red

1.4 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

from enum import Enum, unique


@unique
class Color(Enum):
    red = 1
    red_alias = 1

再执行就会提示错误:ValueError: duplicate values found in

2. 枚举取值

2.1 通过成员的名称来获取成员

Color['red']

2.2 通过成员值来获取成员

Color(2)

2.3 通过成员,来获取它的名称和值

red_member = Color.red
red_member.name
red_member.value

3. 迭代器

3.1 枚举支持迭代器,可以遍历枚举成员

for color in Color:
    print(color)

输出结果是,枚举的所有成员。Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。

3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

from enum import Enum


class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7
    red_alias = 1


for color in Color:
    print(color)

输出结果是:Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。但是Color.red_alias并没有出现在输出结果中。

3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__

from enum import Enum

class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7
    red_alias = 1


for color in Color.__members__.items():
    print(color)

输出结果:(‘red’,

4. 枚举比较

4.1 枚举成员可进行同一性比较

Color.red is Color.red

输出结果是:True

Color.red is not Color.blue

输出结果是:True

4.2 枚举成员可进等值比较

Color.blue == Color.red

输出结果是:False

Color.blue != Color.red

输出结果是:True

4.3 枚举成员不能进行大小比较

Color.red < Color.blue

输出结果出错:TypeError: unorderable types: Color() < Color()


# 枚举类 Enum
from enum import Enum

Month = Enum('Month',('Jan','Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

for name,member in Month.__members__.items():
    # value属性则是自动赋给成员的int常量,默认从1开始计数
    print(name,'=>',member,',',member.value) 

# 输出结果
# Jan => Month.Jan , 1
# Feb => Month.Feb , 2
# Mar => Month.Mar , 3
# Apr => Month.Apr , 4
# May => Month.May , 5
# Jun => Month.Jun , 6
# Jul => Month.Jul , 7
# Aug => Month.Aug , 8
# Sep => Month.Sep , 9
# Oct => Month.Oct , 10
# Nov => Month.Nov , 11
# Dec => Month.Dec , 12

# 如果需要更精确地控制枚举类型,可以从Enum派生出自定义类
from enum import Enum,unique

@unique
class WeekDay(Enum):
    Sun = 0 #设置sun 的value为0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6
    # Sat = 6 # 如果重复会报错 TypeError: Attempted to reuse key: 'Sat'
    # @unique装饰器可以帮助我们检查保证没有重复值

# 访问这些枚举类型可以有若干种方法:
day1 = WeekDay.Mon
print(day1) # WeekDay.Mon

print(WeekDay.Thu) # WeekDay.Thu

print(WeekDay['Tue']) # WeekDay.Tue

print(WeekDay.Tue.value) # 2

print(day1 == WeekDay.Mon) # True

print(day1 == WeekDay.Sun) # False

print(WeekDay(1)) # WeekDay.Mon

print(day1 == WeekDay(1)) # True

print(Weekday(7)) # NameError: name 'Weekday' is not defined

python type()动态创建类

type()函数可以查看一个类型或变量的类型,Hello是一个class,它的类型就是type,而h是一个实例,它的类型就是class Hello。

我们说class的定义是运行时动态创建的,而创建class的方法就是使用type()函数。

type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)…的定义:

def fn(self,name='world'):
    print('hello,%s.' % name)
Hello = type('Hello',(object,),dict(hello=fn))
h = Hello()

h.hello() # hello world.

h.hello('py') # hello py.

print(type(Hello)) # <class 'type'>

print(type(h)) # <class '__main__.Hello'>

要创建一个class对象,type()函数依次传入3个参数:

class的名称;
继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。

正常情况下,我们都用class Xxx…来定义类,但是,type()函数也允许我们动态创建出类来,也就是说,动态语言本身支持运行期动态创建类,这和静态语言有非常大的不同,要在静态语言运行期创建类,必须构造源代码字符串再调用编译器,或者借助一些工具生成字节码实现,本质上都是动态编译,会非常复杂。

--结束END--

本文标题: Python 枚举

本文链接: https://lsjlt.com/news/185825.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 【枚举】
    枚举,枚举可以看成“一组常量的集合”,就是向一个类中添加若干个变量。 from enum import Enum class Week(Enum): #Week类继承Enum类 Mon = 1 Tue = ...
    99+
    2023-01-30
    python
  • Python 枚举
    1. 枚举的定义 首先,定义枚举要导入enum模块。 枚举定义用class关键字,继承Enum类。 用于定义枚举的class和定义类的class是有区别。 示例代码: from enum import Enum class ...
    99+
    2023-01-31
    Python
  • python枚举类型
    笔记: 一:枚举类型的定义二:枚举类和普通类的区别 1:值不可变 2:具有防止相同标签得功能,不同标签的值可以相同!三:枚举类型、枚举值、枚举名称 1:VIP.YELLOW.Value 获得标签的值 2:VIP....
    99+
    2023-01-30
    类型 python
  • 【javaSE】 枚举与枚举的使用
    文章目录 🎄枚举的背景及定义⚾枚举特性总结: 🌲枚举的使用🚩switch语句🚩常用方法📌示例一Ὄ...
    99+
    2023-09-20
    java 开发语言 枚举 源码 反射
  • python如何使用枚举
    小编给大家分享一下python如何使用枚举,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用枚举我们常用 For 循环来遍历某个列表,同样我们也能枚举列表的索引与...
    99+
    2023-06-27
  • Python中使用枚举类
    开发中我们经常定义常量, 其实有更好的方法:为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python中提供了Enum类来实现这个功能: from enum import Enum Numbers...
    99+
    2023-01-31
    Python
  • java枚举
    目录 1.枚举的简介 2.枚举的形式和常用方法 3.枚举中的构造方法 4.练习实例 1.枚举的简介 枚举就是相当于一种来存放常量的特殊的类,是一种新的常量定义方式,提供了安全检查功能,简而言之就是把常量搞的有对象的特性了,类型也是和类...
    99+
    2023-09-02
    java 开发语言
  • 枚举类
    当需要定义常量时,一个办法是用大写变量通过整数来定义 好处是简单,缺点是类型是int,并且仍然是变量 Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较,这样这些相关常量就不会变化了     使用...
    99+
    2023-01-31
  • C#枚举类型与位域枚举Enum
    一、概述 定义一个值类型,其中包含固定值集合。枚举类型变量可以是此集合中的任意一个或多个值。 枚举使用enum关键字来声明,与类同级。 枚举本身可以有修饰符,但枚举的成员始终是公共的...
    99+
    2024-04-02
  • C#枚举和枚举成员怎么使用
    这篇文章主要讲解了“C#枚举和枚举成员怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#枚举和枚举成员怎么使用”吧!C#枚举类型是一种的值类型,它用于声明一组命名的常数。(1)C#枚...
    99+
    2023-06-17
  • C#的枚举与位枚举怎么定义
    这篇文章主要介绍了C#的枚举与位枚举怎么定义的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#的枚举与位枚举怎么定义文章都会有所收获,下面我们一起来看看吧。一、枚举的概念C# 枚举(Enum), 枚举类型是用于...
    99+
    2023-06-27
  • Python枚举方法怎么用
    这篇文章主要介绍“Python枚举方法怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python枚举方法怎么用”文章能帮助大家解决问题。在Python中,枚举和我们在对象中定义的类变量时一样的...
    99+
    2023-06-27
  • python如何使用枚举器
    这篇文章主要为大家展示了“python如何使用枚举器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何使用枚举器”这篇文章吧。玩枚举使用枚举器,在循环中很容易找到索引。testlis...
    99+
    2023-06-27
  • Python 枚举类源码解析
    元类编程,生成类的类,可以动态生成类。 用法: type(name, bases, dict) name -> 类名: str bases -> 基类: tuple dict -> 属性: dict EnumMeta元...
    99+
    2023-01-30
    源码 Python
  • 详解Python中的枚举类型
    目录什么是枚举类型为什么要使用枚举如何使用枚举从字典创建枚举最后的话你好,我是 征哥,今天分享一下 Python 中的枚举类型,为什么需要枚举类型,及如何使用。 什么是枚举类型 枚举...
    99+
    2024-04-02
  • 在Python中怎么使用枚举
    这篇文章主要为大家展示了“在Python中怎么使用枚举”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Python中怎么使用枚举”这篇文章吧。在 Python 中使用枚举。我们可以使用以下方法来...
    99+
    2023-06-27
  • python如何创建一个枚举
    这篇文章主要介绍python如何创建一个枚举,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建一个枚举Enum是Python中用于创建枚举的类,枚举是附加到唯一,恒定值的一组符号名称。为了创建一个枚举,有必要创建一个...
    99+
    2023-06-27
  • 如何使用python创建枚举
    这篇文章主要为大家展示了“如何使用python创建枚举”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用python创建枚举”这篇文章吧。创建枚举Enum是Python中用于创建枚举的类,枚...
    99+
    2023-06-27
  • Python中的枚举怎么实现
    这篇文章主要介绍了Python中的枚举怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中的枚举怎么实现文章都会有所收获,下面我们一起来看看吧。使用普通类直接实现枚举在Python中,枚举和我们...
    99+
    2023-07-05
  • 【Java】枚举类型
    文章目录 一、枚举类型1.1 什么是枚举类型1.2 Java中枚举类型的特点 二、枚举类型的使用2.1 创建语法2.2 常用方法2.3 使用案例 三、枚举的优缺点 一、枚举类型 ...
    99+
    2023-09-02
    java enum 枚举
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作