#python
#python
Вопрос:
Скажем, все подклассы могут получить свой собственный выбор, например class.choice()
from enum import IntEnum
class CompanyType(IntEnum):
BySelf = 1
Agency = 2
@staticmethod
def choice():
return [
(i.value, i.name) for i in CompanyType
]
class CompanyStatus(IntEnum):
StartUp = 1
LargeCompany = 2
@staticmethod
def choice():
return [
(i.value, i.name) for i in CompanyStatus
]
...
Как я могу абстрагировать базовый класс, который может быть унаследован с помощью метода choice
Ожидается, что как:
from enum import IntEnum
class ChoiceBase_():
@staticmethod
def choice():
return [
(i.value, i.name) for i in specified_subclass
]
class CompanyType(ChoiceBase_, IntEnum):
BySelf = 1
Agency = 2
class CompanyStatus(ChoiceBase_, IntEnum):
StartUp = 1
LargeCompany = 2
print(CompanyType.choice())
print(CompanyStatus.choice())
Комментарии:
1. Это похоже на то
@classmethod
, для чего.2. Разве вы не можете просто создать исключение в
ChoiceBase.__init__
iftype(self)
isChoiceBase
?
Ответ №1:
Используйте classmethod
декоратор, чтобы получить константы классов:
class ChoiceBase_():
@classmethod
def choice(cls):
return [(i.value, i.name) for i in cls]
class CompanyType(ChoiceBase_, IntEnum):
BySelf = 1
Agency = 2
class CompanyStatus(ChoiceBase_, IntEnum):
StartUp = 1
LargeCompany = 2
print(CompanyType.choice())
print(CompanyStatus.choice())
Выход:
[(1, 'BySelf'), (2, 'Agency')]
[(1, 'StartUp'), (2, 'LargeCompany')]
Редактировать:
В Python36 наследование от int
гарантирует использование use int.__new__()
, как указано в сообщении об ошибке:
from enum import Enum
class CompanyStatus(int, ChoiceBase_, Enum):
StartUp = 1
LargeCompany = 2
Комментарии:
1. работает
3.7
, но не удалось с3.6.6
asTypeError: object.__new__(CompanyType) is not safe, use int.__new__()
Как избежать этой ошибки?