首页 > 解决方案 > 如何用指定的方法抽象基类?

问题描述

说所有子类都可以有自己的选择,比如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())

标签: python

解决方案


使用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

推荐阅读