#python #class #enums #class-method
Вопрос:
У меня есть str
Enum
класс mixin , который позволяет другим частям моего кода получать доступ к строковому представлению состояний моих переменных.
Существует определенный citrus
тип перечисления, который может быть из подмножества всех возможных перечислений. В настоящее время я использую a classmethod
для проверки «цитрусовости» как таковой:
from enum import Enum
class Fruits(str, Enum):
apple = "apple"
banana = "banana"
orange = "orange"
lemon = "lemon"
citrus = {orange, lemon}
@classmethod
def is_citrus(cls, state):
return state in cls.citrus
[Использование]:
>>> o = Fruits.orange
>>> Fruits.is_citrus(o)
True
Мои вопросы таковы:
- Подходит ли там метод класса?
- Есть ли лучший способ улучшить проверку «цитрусовости»?
- В настоящее время мне придется использовать
Fruits.is_citrus
методы для проверкиo
объекта перечисления, как можноFruit
изменить класс таким образом, чтобы я мог сделать что-то подобноеo.is_citrus()
?
Комментарии:
1. Ты хотел написать
class Fruits
вместоdef Fruits
этого ?
Ответ №1:
Сделайте это обычным методом экземпляра:
class Fruits(str, Enum):
apple = "apple"
banana = "banana"
orange = "orange"
lemon = "lemon"
citrus = {orange, lemon}
def is_citrus(self):
return self in self.citrus
Я не уверен citrus = {orange, lemon}
, что он делает именно то, что вы думаете (в итоге он становится строковым представлением набора, а не фактическим набором)-вместо того, чтобы иметь citrus
собственное значение перечисления, я бы реализовал концепцию «цитрусовости» исключительно внутри is_citrus
, как это:
def is_citrus(self):
return self in {Fruits.orange, Fruits.lemon}
Комментарии:
1. Тьфу, вот почему перечисления строк сводят на нет весь смысл. Это понятно для обратной совместимости, но это все
Ответ №2:
Что вы думаете об использовании a @property
?
class Fruits(str, Enum):
apple = "apple"
banana = "banana"
orange = "orange"
lemon = "lemon"
@property
def is_citrus(self):
return self in ['orange', 'lemon']
>>> o = Fruits.orange
>>> o.is_citrus
True
>>> a = Fruits.apple
>>> a.is_citrus
False