栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python,Enum类型有什么用处?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python,Enum类型有什么用处?

枚举的目的是什么?他们为语言创造了什么价值?什么时候应该使用它们,什么时候应该避免使用它们?

Enum类型通过PEP 435进入Python 。给出的理由是:

枚举的属性可用于定义一组不变的,相关的常数值,这些常数值可能具有也可能没有语义。

当为此目的使用数字和字符串时,它们可以被表征为“魔术数字”或“魔术字符串”。数字很​​少带有语义,字符串很容易混淆(大写,拼写,蛇形或驼峰式大写?)

星期几和学校字母成绩是这种价值集合的例子。

这是docs中的示例:

from enum import Enumclass Color(Enum):    red = 1    green = 2    blue = 3

像裸类一样,这比namedtuple示例更具可读性和优雅性,它也是不可变的,并且还有其他好处,如下所述。

严格支配:枚举成员的类型为枚举

>>> type(Color.red)<enum 'Color'>>>> isinstance(Color.green, Color)True

这使您可以在Enum定义中的成员上定义功能。可以使用其他现有方法来完成在值上定义功能的操作,但这将非常麻烦。

改进:字符串强制

字符串表示形式是人类可读的,而repr具有更多信息:

>>> print(Color.red)Color.red>>> print(repr(Color.red))<Color.red: 1>

我发现这是对魔术数字的改进,甚至可能比namedtuple中的字符串更好。

迭代(奇偶校验):

枚举也支持迭代(类似于namedtuple,但不支持裸类):

>>> for color in Color:        print(color)Color.redColor.greenColor.blue

__members__
属性是枚举名称到它们各自的枚举对象的有序映射(类似于namedtuple的
_asdict()
函数)。

>>> Color.__members__mappingproxy(OrderedDict([('red', <Color.red: 1>), ('green', <Color.green: 2>), ('blue', <Color.blue: 3>)]))

泡菜支持(平价)

您可以序列化和反序列化枚举(以防有人担心):

>>> import pickle>>> color.red is pickle.loads(pickle.dumps(color.red))True

改进:别名

这是光秃秃的类所没有的一个不错的功能,并且很难分辨出别名在其中

namedtuple

class Color(Enum):    red = 1    green = 2    blue = 3    really_blue = 3

别名在规范名称之后,但它们都相同:

>>> Color.blue is Color.really_blueTrue

如果应禁止使用别名以避免值冲突,请使用

enum.unique
装饰器(严格的主导功能)。

严格占主导地位:与
is

枚举旨在使用进行测试

is
,这是在过程中快速检查单个对象的身份。

>>> Color.red is Color.redTrue>>> Color.red is Color.blueFalse>>> Color.red is not Color.blueTrue

相等性测试也可以,但是与身份的测试

is
是最佳的。

与其他Python类不同的语义

枚举类具有与常规Python类型不同的语义。Enum的值是Enum的实例,并且是这些值在内存中的单例-实例化它们没有其他目的。

>>> Color.red is Color('red')

要记住这一点很重要,也许是不利的一面,但是在这个方面进行比较就是将苹果与橙子进行比较。

枚举不被假定为有序

虽然Enum类知道创建成员的顺序,但不假定枚举是有序的。这是一个功能,因为可能被枚举的许多事物没有自然顺序,因此顺序将是任意的。

但是,您可以给您的枚举顺序(请参阅下一节)。

子类化

您不能使用声明了成员的Enum子类化,但 可以
将未声明成员共享行为的Enum子类化(请参阅docs中的OrderedEnum配方)。

这是一个功能-用成员将Enum子类化几乎没有意义,但同样,比较是苹果和橘子。

enum.Enum
什么时候应该使用?

这是Python中新的规范枚举。协作者会期望您的枚举的行为像这些枚举。

在代码中有规范的枚举数据源的任何地方都可以使用它,在此处要显式指定使用规范名称而不是任意数据。

例如,如果在你的代码,你希望用户状态,它不是

"Green"
"green"
,2,或
"Greene"
,但
Color.green
-使用enum.Enum对象。它既明确又具体。

文档中有很多示例和配方。

我什么时候应该避免使用它们?

停止自己动手或让人们猜测魔术数字和字符串。不要回避它们。拥抱他们。

但是,如果出于历史原因要求您的枚举成员必须为整数,则

IntEnum
来自同一模块的枚举成员具有相同的行为,但是它也是整数,因为它
int
在子类化之前先将内建子类化
Enum
。来自
IntEnum
的帮助:

class IntEnum(builtins.int, Enum)

我们可以看到IntEnum值将作为的实例进行测试

int



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/623461.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号