获取基类的所有子类作为基类的类属性

2024-04-20 02:55:07 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个继承自抽象类的类,我希望能够获得它的所有子类,但是是从类本身中获得的。你知道吗

我成功地创建了一个@classmethod这样做:

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

但是有没有一种方法可以使用@property或者通过class属性来实现呢?你知道吗

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

Tags: get属性maindefpassclasskingdomcls
1条回答
网友
1楼 · 发布于 2024-04-20 02:55:07

您可以使用descriptor class

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'>]

相关问题 更多 >