百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python3.7知其然知其所以然-第二十一章,枚举类型

off999 2024-09-18 22:40 29 浏览 0 评论

枚举(Enum)跟整型一样,是一种数据类型。它是一系列常量的集合,通常用于表示某些特定的有限集合,如月份、星期、状态、性别(男、女、不男不女)等,当一个变量有几种可能取值的时候,定义为枚举类型。

21.1 枚举定义

枚举是不可变类型,一旦定义创建,其成员的值不可改变,名称不可重复,通过class关键字和继承Enum类进行定义。定义时若出现成员的值相同,那只有第一个有效,其语法结构为:

class 枚举名(Enum):

成员名1 = 值1

成员名x = 值n

# ---引入枚举类---
from enum import Enum
class Colors(Enum):
	red = 1
	orange = 2
	yellow = 3
	green = 4
	red_alias = 1
	
	
print(Colors(1))

21.2 整型枚举

枚举成员的值支持多种数据类型,如字符串、布尔或整型等,如要指定为整型,可继承IntEnum类。注意,就算指定为IntEnum,其成员的值照样可以为字符串等,但在获取成员的值时,会进行自动转换,如果转换失败,会报错。当然,既然指定为整型了,就不要故意指定为字符串等了。

# ---引入枚举类---
from enum import Enum, IntEnum
# 字符串枚举
class Gender(Enum):
	Male = "男"
	Female = "女"
	Unknown = "保密"
print(Gender.Male.value)
# 整型枚举
class Number(IntEnum):
 One = 1
 Two = 2
 # 会自动转为整型
 Three = "3"
print(Number.Three.value)

21.3 唯一值

如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique进行限制。如若出现相同值,运行时会报错。

# 引入枚举类和唯一装饰器
from enum import Enum, unique
@unique
class Weekday(Enum):
	Sun = 0
	Mon = 1
	Tue = 2
	Wed = 3
	Thu = 4
 Fri = 5
	Sat = 6
print(Weekday.Sat.value)

21.4 枚举取值

枚举可通过成员获取它的名称和值,可通过名称或值获取成员。

# 引入枚举类和唯一装饰器
from enum import Enum, unique
@unique
class Months(Enum):
 Jan = 1
	Feb = 2
	Mar = 3
	Apr = 4
	May = 5
	Jun = 6
	Jul = 7
	Aug = 8
	Sep = 9
	Oct = 10
	Nov = 11
	Dec = 12
# 通过成员获取名称和值
print(Months.Jan.name, Months.Jan.value)
# 通过名称和值获取成员
print(Months["Feb"], Months(2))

21.5 枚举遍历

通过for循环遍历枚举成员时,如若出现成员的值相同时,只获取第一个成员。当然,如果要遍历所有成员的话,得用特殊的方式获取,就是通过__menbers__属性。

# ---引入枚举类---
from enum import Enum
class Colors(Enum):
	red = 1
	orange = 2
	yellow = 3
	green = 4
 red_alias = 1
# 获取成员名称,值相等的,只获取第一个
for color in Colors:
 print(color.name)
# 获取所有成员名称
for color in Colors.__members__:
 print(color)

21.6 枚举比较

枚举成员不可以比较大小,但可以通过is、is not 和==、!=进行同性或等值比较。

# ---引入枚举类---
from enum import Enum
class Colors(Enum):
	red = 1
	orange = 2
	yellow = 3
	green = 4
 red_alias = 1
# is 判断
result = Colors.red is Colors.red
print(result)
# is not判断
result = Colors.red is not Colors.green
print(result)
# ==比较值是否相等
result = Colors.red == Colors.red_alias
print(result)
# !=比较值是否不相等
result = Colors.red != Colors.green
print(result)

21.7 类中枚举

枚举可以定义在类里,并可通过类名和枚举名进行调用。

# ---引入枚举类---
from enum import Enum
class Plane:
	def __init__(self, color):
	 self.color = color
	
	# 类的成员
	class Colors(Enum):
	 Red = 1
	 Orange = 2
	 Yellow = 3
	 Green = 4
	 Blue = 5
plane = Plane(Plane.Colors.Blue.value)
print(plane.color)

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: