簡體   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