python 是否可以更改枚举中的属性值?

rks48beu  于 2022-12-25  发布在  Python
关注(0)|答案(4)|浏览(203)

我需要重新分配枚举中的属性值。

from enum import Enum

class Number(Enum):
    number = "1"

Number.number = "2" # AttributeError: cannot reassign member 'number'

我尝试重新分配属性,但收到AttributeError

b4lqfgs4

b4lqfgs41#

作者注解:这是个糟糕的主意。

让我们从python中删除字符串"1",并将其替换为"2"

from ctypes import c_byte
from enum import Enum
from sys import getsizeof

def change_enum_value(old: object, new: object) -> None:
    """
    Assigns contents of new object to old object.
    The size of new and old objection should be identical.

    Args:
        old (Any): Any object
        new (Any): Any object
    Raises:
        ValueError: Size of objects don't match
    Faults:
        Segfault: OOB write on destination
    """
    src_s, des_s = getsizeof(new), getsizeof(old)
    if src_s != des_s:
        raise ValueError("Size of new and old objects don't match")
    src_arr = (c_byte * src_s).from_address(id(new))
    des_arr = (c_byte * des_s).from_address(id(old))
    for index in range(len(des_arr)):
        des_arr[index] = src_arr[index]

class Number(Enum):
    number = "1"

change_enum_value(Number.number.value, "2")
print(Number.number.value)  # 2

你不再有"1"了,毫不夸张地说。

>>> "1" 
'2'
>>>

这确实有点让人担心...

ua4mk5z4

ua4mk5z42#

当使用枚举时,您的number = "1"被视为枚举项之一。
因此,首先,它被认为是这样使用的,例如:

from enum import Enum

class Number(Enum):
    numberOne = "1"
    numberTwo = "2"

顺便说一句,当访问Number.number时,您访问的是“enumitem”,它不仅仅是值,实际上,该项有一个名称(number)和一个值("1")。
因此,从理论上讲,更改值的好方法应该是:

Number.number.value = "2"

但是,在任何was中,Enum都是不可变的,所以无论如何你都不能这么做。

vsaztqbk

vsaztqbk3#

从概念上讲,枚举是一种为“常量”给予“更好的名称”,然后在代码中使用更好的名称而不是使用常量的方法。
Python通过将枚举成员设置为“函数常量”来实现这个目的......参见Python Enum Documentation
与枚举关联的名称与变量不同。
因此,您无法更改名称的值。

fjnneemd

fjnneemd4#

如果您阅读了枚举文档:属性Number.number等是枚举成员(或成员),并且是函数常量.

相关问题