获取基础 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'>]
鉴于 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'>]