2 回答
TA貢獻1895條經驗 獲得超7個贊
@classmethod
def by_x(cls, criterion):
return [
m
for m in cls
if m.variable_category == criterion
or m.variable_type == criterion
]
順便說一句,您不能分配給self.name- 它會引發AttributeError.
TA貢獻1783條經驗 獲得超5個贊
該解決方案可以滿足您的需求。
類get_by_values方法可以接收一個列表,或者具有您想要滿足的任何值組合的列表列表。它保證只返回完全滿足您傳入的組合之一的成員。它返回一個set成員Enum,因此保證沒有任何重復。如果您在返回中使用列表,您將獲得與您傳入的每個參數相對應的有序結果。
Variable成員已經有Variable.name你聲明他們。如果您想要更具表現力的東西,我會選擇__str__or ,也許與and__init__結合使用。VariableCategory.nameVariableType.name
from enum import Enum, auto
class VariableCategory(Enum):
SHORT = auto()
MEDIUM = auto()
LONG = auto()
class VariableType(Enum):
ONE = auto()
TWO = auto()
class Variable(Enum):
A = VariableCategory.SHORT, VariableType.ONE
B = VariableCategory.MEDIUM, VariableType.TWO
C = VariableCategory.SHORT, VariableType.TWO
def __init__(self, variable_category: VariableCategory, variable_type: VariableType):
self.variable_category = variable_category
self.variable_type = variable_type
def in_value(self, argument):
if set(argument).issubset(set(self.value)):
return self
@classmethod
def get_by_values(cls, *args):
return {member for member in cls
if member in {member.in_value(arg) for arg in args}}
first = [VariableCategory.SHORT, VariableType.ONE]
second = [VariableCategory.SHORT]
print(*Variable.get_by_values(first, second))
# Variable.A Variable.C
print(*Variable.get_by_values([VariableCategory.MEDIUM]))
# Variable.B
print(*Variable.get_by_values([VariableType.TWO]))
# Variable.B Variable.C
編輯:用集合推導替換 for。擴展的部分如下:
def in_value(self, argument):
for element in argument:
if element not in self.value:
return False
return True
@classmethod
def get_by_values(cls, *args):
result = list()
for one_member in Variable:
for argument in args:
if one_member.in_value(argument):
if one_member not in result:
result.append(one_member)
return result
添加回答
舉報
