python - 枚举和命名元组有什么区别?

标签 python python-3.x enums namedtuple

我想知道 enum 和 namedtuple 之间有什么区别,什么时候应该使用其中一个。

最佳答案

作为一个类比(尽管不完美),您可以将 python 中的 enum.Enumnamedtuple 视为 enumstruct 在 C 中。换句话说,enum 是一种别名值的方式,而 namedtuple 是一种按名称封装数据的方式。两者并不能真正互换,您可以使用 enums 作为 namedtuple 中的命名值。

我认为这个例子说明了差异。

from collections import namedtuple
from enum import Enum

class HairColor(Enum):
    blonde = 1
    brown = 2
    black = 3
    red = 4

Person = namedtuple('Person', ['name','age','hair_color'])
bert = Person('Bert', 5, HairColor.black)

您可以像访问常规对象一样访问该人的命名“属性”。

>>> print(bert.name)
Bert
>>> print(bert.age)
5
>>> print(bert.hair_color)
HairColor.black
>>> print(bert.hair_color.value)
3

您通常不会看到像这样的 namedtuple,因为同样的基本概念可以通过使用更广为人知的 class 声明来实现。下面的 class 定义与上面的 namedtuple 定义几乎相同。

class Person:
    def __init__(self, name, age, hair_color):
        self.name = name
        self.age = age
        self.hair_color = hair_color

然而,namedtupleclass 对象之间的主要区别在于 namedtuple 的属性在创建后不能更改。

关于python - 枚举和命名元组有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40632750/

相关文章:

python - Pandas 数据框的最大大小

python - PyCharm 类型提示枚举迭代

python - Paramiko 更改在版本 2.1 和 2.4 之间使用字符串密码打破了 "connect"-ish

python - 对具有相等值的列表求和和聚合

python - 保存/加载词典

python - 如何在 Ubuntu 12.04 中为 Python3 安装库 netifaces?

objective-c - 匿名与定义枚举

c++ - 作用域枚举的 "using namespace X"等效项?

python - 如何在 pyplot (matplotlib) 中的同一个图上添加两个颜色条?

python - 如何设置带有评估集的学习xgboost?