获取基础 class 的所有子class 作为基础 class 的 class 属性

Get all subclasses of a base class as the base class's class attribute

鉴于 class 从抽象 class 继承,我希望能够获得它的所有子 class es,但是 来自 class 本身。

我已经设法创建了一个 @classmethod 这样做:

>>> Eukaryota.get_subtypes()
[<class '__main__.Plantae'>, <class '__main__.Fungi'>]

但是有没有办法使用 @property 或通过 class 属性来做到这一点?

>>> Eukaryota.subtypes
[<class '__main__.Plantae'>, <class '__main__.Fungi'>]

(似乎属性只适用于 class 的实例,而不是 class 本身。)

这是 @classmethod(使用分类法):

from abc import ABCMeta, abstractmethod


class Kingdom(object):
    __metaclass__ = ABCMeta

    @classmethod
    @abstractmethod
    def get_subtypes(cls):
        pass


class Prokaryota(Kingdom):
    @classmethod
    def get_subtypes(cls):
        return cls.__subclasses__()


class Eukaryota(Kingdom):
    @classmethod
    def get_subtypes(cls):
        return cls.__subclasses__()

class Bacteria(Prokaryota):
    pass


class Plantae(Eukaryota):
    pass


class Fungi(Eukaryota):
    pass

您可以使用 descriptor class:

class get_subclasses:
    def __get__(self, obj, objtype):
        return objtype.__subclasses__()

class Eukaryota(Kingdom):
    subtypes = get_subclasses()

这样 Eukaryota.subtypes 就会 return:

[<class '__main__.Plantae'>, <class '__main__.Fungi'>]