Получить все подклассы базового класса в качестве атрибута класса базового класса - PullRequest
0 голосов
/ 13 сентября 2018

Учитывая класс , унаследованный от абстрактного класса , я хотел бы иметь возможность получить все его подклассы, но внутри самого класса .

Мне удалось создать @classmethod, сделав так:

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

но есть ли способ, которым я мог бы сделать это, используя @property или через атрибут класса?

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

(Кажется, что свойства предназначены только для экземпляров класса, а не для самого класса.)

Вот тот, у которого @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

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете использовать класс дескриптора :

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

class Eukaryota(Kingdom):
    subtypes = get_subclasses()

, чтобы Eukaryota.subtypes вернул:

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