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