繁体   English   中英

重载 __getitem__ 枚举 Python 以返回元组的第一个元素

[英]Overloading __getitem__ enum Python to return the first element of a tuple

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

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.')

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

Command.SUCCESSSUCCESS.value都是属性访问,所以__getitem__永远不会进入图片。

如果您希望该value 0 (或1等),那么您希望将0, "Exited successsssfully"分成两部分——也许是value__doc__ 要查看仅使用 stdlib Enum完成的类似内容,请尝试此操作

至于子类化EnumMeta请阅读此内容

你不需要一个新的元类,只需要普通的继承。 __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类中定义。)

关于枚举的文档给出了一个很好的例子,说明如何在枚举上存储多个常量,并通过属性名称访问它们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM