簡體   English   中英

具有可變數量屬性的枚舉成員的 Python 元類

[英]Python metaclass for Enum members with variable number of attributes

我是 Python 元類的新手,目前正在嘗試實現以下目標:

from enum import Enum, EnumMeta

class FlexEnumMeta(EnumMeta):
   # see the attempt for the implementation below
   ...

class FlexEnum(Enum, metaclass=FlexEnumMeta, attrs=('foo', 'bar')):
   X = 'abc', 123
   Y = 'def', 456

我希望它可以按如下方式工作:

FlexEnum.X.foo
>>> 'abc'

我閱讀了 Enum 和aenum的部分源代碼以試圖理解,據我所知,FlexEnumMeta 的代碼如下:

class FlexEnumMeta(EnumMeta):

    @classmethod
    def __prepare__(metacls, cls, bases, attrs=None, **kwargs):
        return {}

    def __new__(metacls, name, bases, clsdict, attrs=None, **kwargs):
        # Proper way to get an _EnumDict,
        # to be passed to super().__new__
        enum_dict = super().__prepare__(name, bases, **kwargs)

        # Enumeration class members
        members = []

        for member_name, values in clsdict.items():
            # Copy original clsdict in final class members list
            if member_name.startswith('_'):
                enum_dict[member_name] = values
                continue

            # Create correspondance between attributes names and values
            value_dict = dict(zip(attrs, values))
            members.append((member_name, value_dict))

        # Copy custom class members in final class members list
        for key, value in members:
            enum_dict[key] = value

        return super().__new__(metacls, name, bases, enum_dict)

class FlexEnum(Enum, metaclass=FlexEnumMeta, attrs=('foo', 'bar')):
    X = 'abc', 123
FlexEnum.X
>>> <FlexEnum.X: {'foo': 'abc', 'bar': 123}>
FlexEnum.X.value['foo']
>>> 'abc'

我嘗試使用 aenum 的 MultiValue 設置,但我需要將 dict 作為我的屬性之一,而這些屬性不可散列。 最后,這對我來說是一種鍛煉。

您只需要定義FlexEnum.__init__

import enum


class FlexEnum(enum.Enum):
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

    X = 'abc', 123
    Y = 'def', 456

然后

>>> FlexEnum.X.foo
'abc'

成員本身的值將是元組。 如果你想要別的東西,你可以覆蓋__new__ 文檔中有更多信息, 何時使用__new__()__init__()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM