Как абстрагировать базовый класс с помощью указанного метода?

#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__ if type(self) is ChoiceBase ?

Ответ №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 as TypeError: object.__new__(CompanyType) is not safe, use int.__new__() Как избежать этой ошибки?