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.
fonte
2017-11-01 17:02:13