[英]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.SUCCESS
和SUCCESS.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.