2013-08-18 53 views

回答

21

inspect模块也许会有帮助,特别是getclasstree()功能:

安排班定列表到嵌套列表的层次结构。 如果出现嵌套列表,它包含从 类派生的类,该类的条目紧挨着列表的前面。

inspect.getclasstree(inspect.getmro(Exception)) 

或者,您可以通过__subclasses__()递归下降的一个继承树,像这样:

def classtree(cls, indent=0): 
    print '.' * indent, cls.__name__ 
    for subcls in cls.__subclasses__(): 
     classtree(subcls, indent + 3) 

classtree(BaseException) 

打印:从标准库,而不是

BaseException 
... Exception 
...... StandardError 
......... TypeError 
......... ImportError 
............ ZipImportError 
......... EnvironmentError 
............ IOError 
............... ItimerError 
............ OSError 
......... EOFError 
......... RuntimeError 
............ NotImplementedError 
......... NameError 
............ UnboundLocalError 
......... AttributeError 
......... SyntaxError 
............ IndentationError 
............... TabError 
......... LookupError 
............ IndexError 
............ KeyError 
............ CodecRegistryError 
......... ValueError 
............ UnicodeError 
............... UnicodeEncodeError 
............... UnicodeDecodeError 
............... UnicodeTranslateError 
......... AssertionError 
......... ArithmeticError 
............ FloatingPointError 
............ OverflowError 
............ ZeroDivisionError 
......... SystemError 
............ CodecRegistryError 
......... ReferenceError 
......... MemoryError 
......... BufferError 
...... StopIteration 
...... Warning 
......... UserWarning 
......... DeprecationWarning 
......... PendingDeprecationWarning 
......... SyntaxWarning 
......... RuntimeWarning 
......... FutureWarning 
......... ImportWarning 
......... UnicodeWarning 
......... BytesWarning 
...... _OptionError 
... GeneratorExit 
... SystemExit 
... KeyboardInterrupt 
0

重用代码滚动你自己的。

import inspect 
import pydoc 

def print_class_hierarchy(classes=()): 
    td = pydoc.TextDoc() 
    tree_list_of_lists = inspect.getclasstree(classes) 
    print(td.formattree(tree_list_of_lists, 'NameSpaceName')) 

要使用此,我们需要的类层次,以列表的形式,这是有道理的,我们通过我们的函数。我们可以通过递归搜索一类.__subclasses__()方法的结果,使用此功能(which I'll keep the canonical version of here)建立这样的:

def get_subclasses(cls): 
    """returns all subclasses of argument, cls""" 
    if issubclass(cls, type): # not a bound method 
     subclasses = cls.__subclasses__(cls) 
    else: 
     subclasses = cls.__subclasses__() 
    for subclass in subclasses: 
     subclasses.extend(get_subclasses(subclass)) 
    return subclasses 

放在了一起:

list_of_classes = get_subclasses(int) 
print_class_hierarchy(list_of_classes) 

它打印(在Python 3):

>>> print_class_hierarchy(classes) 
builtins.int(builtins.object) 
    builtins.bool 
    enum.IntEnum(builtins.int, enum.Enum) 
     inspect._ParameterKind 
     signal.Handlers 
     signal.Signals 
    enum.IntFlag(builtins.int, enum.Flag) 
     re.RegexFlag 
    sre_constants._NamedIntConstant 
    subprocess.Handle 
enum.Enum(builtins.object) 
    enum.IntEnum(builtins.int, enum.Enum) 
     inspect._ParameterKind 
     signal.Handlers 
     signal.Signals 
enum.Flag(enum.Enum) 
    enum.IntFlag(builtins.int, enum.Flag) 
     re.RegexFlag 

这给了我们一棵树的所有子类,以及相关的多继承类 - 并告诉我们他们住的模块。