How to find all the subclasses of a class given its name?

后端 未结 10 1857
遥遥无期
遥遥无期 2020-11-22 10:14

I need a working approach of getting all classes that are inherited from a base class in Python.

10条回答
  •  时光说笑
    2020-11-22 11:02

    This isn't as good an answer as using the special built-in __subclasses__() class method which @unutbu mentions, so I present it merely as an exercise. The subclasses() function defined returns a dictionary which maps all the subclass names to the subclasses themselves.

    def traced_subclass(baseclass):
        class _SubclassTracer(type):
            def __new__(cls, classname, bases, classdict):
                obj = type(classname, bases, classdict)
                if baseclass in bases: # sanity check
                    attrname = '_%s__derived' % baseclass.__name__
                    derived = getattr(baseclass, attrname, {})
                    derived.update( {classname:obj} )
                    setattr(baseclass, attrname, derived)
                 return obj
        return _SubclassTracer
    
    def subclasses(baseclass):
        attrname = '_%s__derived' % baseclass.__name__
        return getattr(baseclass, attrname, None)
    
    
    class BaseClass(object):
        pass
    
    class SubclassA(BaseClass):
        __metaclass__ = traced_subclass(BaseClass)
    
    class SubclassB(BaseClass):
        __metaclass__ = traced_subclass(BaseClass)
    
    print subclasses(BaseClass)
    

    Output:

    {'SubclassB': ,
     'SubclassA': }
    

提交回复
热议问题