我想用 Python 為 Enums 撰寫類。
我的問題是我希望對不同的列舉輸入具有相同的值。例如:
class Animal(Enum):
Cat = ['Perian cat', 'Bengal cat', 'Siamese cat']
那么我可以像這樣使用它:
some_animal = Animal('Persian cat')
print(some_animal)
>> Animal.Cat
我認為這是不可能的,但只是為了確定我想在這里提出要求。
更新
我試過這個解決方案:
class _Cat(Enum):
BENGAL = 'Bengal cat'
PERSIAN = 'Persian cat'
SIAMESE = 'Siamese cat'
class Animal(Enum):
Cat = _Cat
從這個意義上說,我可以訪問 Cat 類的值,但我想要實作的是這樣的:
some_animal = Animal('Persian cat')
print(some_animal)
>> Animal.Cat.PERSIAN
謝謝。
uj5u.com熱心網友回復:
您可以使用函式式 API 獲得接近的結果。事實上,困難的部分不是擁有多個具有相同值的成員,而是擁有包含空格的名稱(即:不能是識別符號):
Animal = Enum('Animal', (('Persian cat', 'cat'), ('Bengal cat', 'cat'),
('Siamese cat', 'cat')))
然后你可以這樣做:
>>> print(Animal['Persian cat'].value)
cat
你可以控制成員的平等:
>>>Animal['Persian cat'] == Animal['Bengal cat']
True
但是隨后您的 enum 類變得非常接近一個普通的dict. 如果您還打算添加新成員,那么恕我直言,這暗示您想要的不是Enum一個簡單的dict.
uj5u.com熱心網友回復:
最簡單的方法是使用MultiEnumfrom aenum:
from aenum import MultiValueEnum
class Animal(MultiValueEnum):
CAT = 'Cat', 'Persian cat', 'Bengal cat', 'Siamese cat'
DOG = 'Dog', 'Greyhound', 'Boxer', 'Great Dane'
def __repr__(self):
# make the repr not reduntant
return "<%s.%s>" % (self.__class__.__name__, self.name)
并在使用中:
>>> Animal('Bengal cat')
<Animal.CAT>
>>>> Animal('Boxer')
<Animal.DOG>
如果您需要堅持使用 stdlib 版本Enum:
from enum import Enum
class Animal(Enum):
#
def __new__(cls, *values):
member = object.__new__(cls)
member._value_ = values[0]
member.all_values = values
return member
#
@classmethod
def _missing_(cls, value):
for member in cls:
if value in member.all_values:
return member
#
CAT = 'Cat', 'Persian cat', 'Bengal cat', 'Siamese cat'
DOG = 'Dog', 'Greyhound', 'Boxer', 'Great Dane'
def __repr__(self):
# make the repr not reduntant
return "<%s.%s>" % (self.__class__.__name__, self.name)
披露:我是Python stdlibEnum、enum34backport和Advanced Enumeration ( aenum) 庫的作者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/385022.html
