2013-08-18 20 views

risposta

21

inspect potrebbe aiutare, in particolare getclasstree() funzione:

disporre l'elenco delle classi data in una gerarchia di liste annidate. Quando viene visualizzato un elenco nidificato, contiene classi derivate dalla classe la cui voce precede immediatamente l'elenco.

inspect.getclasstree(inspect.getmro(Exception)) 

alternativa, è possibile in modo ricorsivo passare attraverso __subclasses__() giù da un albero di ereditarietà, come questo:

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

classtree(BaseException) 

stampe:

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

il riutilizzo del codice dalla libreria standard invece di rotolare il tuo.

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

Per utilizzare questo, abbiamo bisogno di una gerarchia di classi, sotto forma di una lista, che ha senso per noi di passare la nostra funzione. Siamo in grado di costruire questo ricorsivamente ricerca di un classi .__subclasses__() risultati del metodo, utilizzando questa funzione (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 

mettere questo insieme:

list_of_classes = get_subclasses(int) 
print_class_hierarchy(list_of_classes) 

che stampa (in 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 

Questo ci dà un albero di tutte le sottoclassi, così come le relative classi di ereditarietà multiple e ci dice i moduli in cui vivono.

Problemi correlati