重载uu getitem uuu枚举Python以返回元组的第一个元素

2024-09-27 21:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中重载getitemEnum方法,以返回元组的第一个元素,而不是整个值内容。为此,我尝试使用重定义的方法在EnumMeta中创建一个枚举,如下所示,然后从中继承Enum final类,如下所示:

from enum import Enum
from enum import EnumMeta
from datetime import date

class CommandMeta (EnumMeta):
    SUCCESS = 0, "Exited successsssfully."

    def __getitem__(cls, value, *args, **kwargs):
        value = value[0]
        return super().__getitem__(value, *args, **kwargs)

class Command (Enum, metaclass=CommandMeta):
    SUCCESS = 0, "Exited successsssfully."

预期产出为:

print(Command.SUCCESS.value)
0

相反,它仍然是一样的:

print(Command.SUCCESS.value)
(0, 'Exited successsssfully.')

我怎样才能正确地重载该方法


Tags: 方法fromimportvalueargsenumcommandclass
3条回答

Command.SUCCESSSUCCESS.value都是属性访问,因此__getitem__从不进入图片

如果您希望value0(或1,等等),那么您希望将0, "Exited successsssfully"分成两部分,可能是^{} and ^{}?要查看类似的内容,只需使用stdlibEnum,请尝试this one

至于子类EnumMetaplease read this

您不需要新的元类,只需要普通的继承__getitem__仅在使用索引语法时调用

class IndexableEnum(Enum):
    def __getitem__(self, key):
        return self.value[key]

class Command(IndexableEnum):
    SUCCESS = 0, "Exited successfully"

然后

>>> Command.SUCCESS
<Command.SUCCESS: (0, 'Exited successfully')>
>>> Command.SUCCESS[0]
0

(当然,从IndexableEnum继承的类应该具有事实上可索引的值,并且__getitem__可以直接在Command类中定义,如果您不打算使多个类可索引。)

有关枚举的文档提供了good example如何在枚举上存储多个常量,并通过属性名访问它们

class Planet(Enum):
    MERCURY = (3.303e+23, 2.4397e6)
    VENUS   = (4.869e+24, 6.0518e6)
    EARTH   = (5.976e+24, 6.37814e6)
    MARS    = (6.421e+23, 3.3972e6)
    JUPITER = (1.9e+27,   7.1492e7)
    SATURN  = (5.688e+26, 6.0268e7)
    URANUS  = (8.686e+25, 2.5559e7)
    NEPTUNE = (1.024e+26, 2.4746e7)
    def __init__(self, mass, radius):
        self.mass = mass       # in kilograms
        self.radius = radius   # in meters
    @property
    def surface_gravity(self):
        # universal gravitational constant  (m3 kg-1 s-2)
        G = 6.67300E-11
        return G * self.mass / (self.radius * self.radius)

当被访问时,看起来是这样的:

>>> Planet.EARTH.value
(5.976e+24, 6378140.0)
>>> Planet.EARTH.mass
5.976e+24
>>> Planet.EARTH.surface_gravity
9.802652743337129

相关问题 更多 >

    热门问题