Python中的枚举类型如何提高代码的可读性
枚举是编程语言中常见的数据类型,如c、c++和java。它们可以帮助您编写类型安全且更易读的代码。
在python中,枚举并不总是被支持的。然而,自3.4版本以来,python现在支持枚举。本文是关于如何创建枚举,如何使用它们以及它们如何提高代码可读性的指南。
枚举是什么,它们能做什么?
枚举或枚举是由其可以取得的值集合定义的数据类型。这个值集合被称为其成员集。枚举使您能够更严格地定义变量可能具有的值。这有助于您编写类型安全的代码。它还提高了可读性。
一些需要了解的术语
在我们讨论枚举时,有一些术语需要首先定义,因为我们将经常使用它们。这些术语是成员和值。
- 成员:这些是形成属于枚举的一组值的命名常量。例如,days枚举可能包含以下成员:sunday,monday,tuesday等。
- 值:这些是用于以不同方式表示每个枚举成员的内部值。这将使比较成为可能。例如,在days枚举中,sunday的值可以为0,monday的值可以为1,tuesday的值可以为2,等等。
现在,我们将讨论枚举如何改进您的代码。
枚举如何提高您的代码
枚举可以改进您的代码,使其更易读,减少错误。以下是一些使用它们的原因:
- 枚举使您能够清楚地定义变量或函数参数期望的值。清楚地表达对变量或函数参数的意图使人们能够轻松理解您的代码。
- 枚举还使您的代码自文档化。这意味着您不必添加注释或文档来指定函数期望的值。相反,您的枚举指定了预期的值。
- 这还使ide能够在传递不正确的值时突出显示错误并提供自动完成支持。
- 结果,您的代码变得类型安全,不太可能产生运行时错误。
接下来,我们将讨论如何在python中创建枚举。
如何在python中创建枚举
python不支持枚举。但它在标准库中提供了一个枚举模块。我们将在本教程中使用该模块。在python中创建枚举有两种方法:类或函数api。我将在本节中涵盖两者。
先决条件
要按照本教程操作,您需要安装python 3.4。该版本的python带有标准库中的枚举模块。如果您还没有安装,请参考以下教程:
要按照本教程操作,您需要了解一些python知识。这包括基本的python和更高级的面向对象编程概念,如类和继承。
#1. 类方法
创建枚举的第一种方法是使用类。首先从enum
模块导入枚举类。接下来,创建一个类来创建您的枚举。这个类将继承您之前导入的enum类。
from enum import enum
class direction(enum):
north = 0
east = 1
south = 2
west = 3
您还可以为枚举的成员分配任何您想要的值。以下是一个示例:与其将0、1、2和3分配给我们的方向枚举,我们将它们分配为相应的头部值0、90、180和270。
from enum import enum
class direction(enum):
north = 0
east = 90
south = 180
west = 270
或者,使用range函数是一种更简洁的生成上述内容的方式。下面的代码片段演示了如何使用range函数:
from enum import enum
class direction(enum):
north, east, south, west = range(0, 360, 90)
在本例中,我们使用range函数生成值。我们将0指定为起始值,360指定为结束值,90指定为递增值。我们从可迭代对象中解构这些值,类似于解构元组的方式。如果想要了解有关元组解构的更多信息,请阅读这篇关于 tuples in python 的文章。
枚举类是抽象类。这意味着它们不能被实例化。相反,它们的属性,即枚举成员,在这种情况下是直接访问的。
#2. 函数方法
函数方法是子类化方法的替代方法。
from enum import enum
direction = enum("direction", ["north", "east", "south", "west"])
在上面的代码片段中,我们创建了一个名为direction的枚举。它可以使用四个成员进行访问,我们将这些成员作为第二个参数提供。默认情况下,这些成员被赋予从1开始的值。因此,north是1,east是2,依此类推。这是因为0是false而不是预期的从零开始的索引。为了使所有值为true,将值从1开始编号。
或者,您可以通过将成员作为元组列表传递来为成员分配值。每个元组由两个元素组成:成员的名称和该成员的值。
from enum import enum
direction = enum(
name = "direction",
values = [
("north", "n"),
("east", "e"),
("south", "s"),
("west", "w"),
]
)
您还会注意到,在上面的示例中,我使用了字符串而不是整数来为成员分配值。这证明了在分配值时,字符串和整数都是有效的。
如何使用枚举
在前一节中,我们介绍了创建枚举并为成员分配值的方法。本节将介绍使用枚举来访问和分配成员以及检查相等性。
如何访问成员
有多种方法可以访问枚举的成员。这些方法包括点语法、括号和方括号语法。下面是一个示例,以演示上述方法:
from enum import enum
# 创建一个枚举
class day(enum):
sunday, monday, tuesday, wednesday, thursday, friday, saturday = range(1, 8)
# 访问枚举成员
# 1. 使用点语法
print(day.sunday)
# 2. 使用方括号
print(day["monday"])
# 3. 使用括号
print(day(3))
在访问枚举成员后,你可以将其存储在一个变量中。请注意,访问成员会给你一个对成员对象的引用,而不是其值或名称。这在接下来的几个部分中需要记住。
访问名称和值
如前所述,当你访问枚举成员时,你创建了对成员对象的引用。如果出于某种原因,你想要访问枚举对象的名称或值,可以使用对象上的name和value属性。
print(day.sunday.name, day.sunday.value)
检查相等性
回想一下,将枚举成员分配给一个变量会创建对枚举成员对象的引用。因此,要检查变量是否具有特定的枚举成员,我们使用is
运算符来检查枚举成员和变量是否指向同一个对象。
下面是一个示例来演示:
today = day.wednesday
if today is day.monday:
print("今天是星期一,:(")
if today is day.wednesday:
print("快乐的星期三")
另外,你可以使用==
运算符。在enum类的超类上,==
运算符是is
运算符的一个包装器。这是通过操作符重载来实现的。你可以在这篇文章中阅读更多相关内容:magic methods。无论如何,这是一个使用==
而不是is
的示例。
today = day.wednesday
if today == day.monday:
print("今天是星期一,:(")
if today == day.wednesday:
print("快乐的星期三")
冒昧地说,枚举比较检查对象的身份,而不是值。
最后的话
本文介绍了枚举是什么以及它们为什么有用。我们还介绍了通过子类化enum类和使用功能api来创建枚举的不同方法。
此外,我们还介绍了如何使用枚举、访问值和进行比较。接下来,你可能想阅读我们关于typescript枚举的文章。