2013-08-18 35 views

Trả lời

21

inspect mô-đun có thể giúp đỡ, đặc biệt getclasstree() chức năng:

Sắp xếp danh sách cho các lớp học vào một hệ thống các danh sách lồng nhau. Trường hợp danh sách lồng nhau xuất hiện, nó chứa các lớp bắt nguồn từ lớp có mục nhập ngay trước danh sách.

inspect.getclasstree(inspect.getmro(Exception)) 

Hoặc, bạn có một cách đệ quy có thể đi qua __subclasses__() xuống bởi một cây thừa kế, như thế này:

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

classtree(BaseException) 

in:

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

đang tái sử dụng từ các thư viện chuẩn thay vì lăn của riêng bạn.

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

Để sử dụng điều này, chúng tôi cần một phân cấp các lớp, dưới dạng danh sách, có ý nghĩa để chúng tôi chuyển chức năng của mình. Chúng tôi có thể xây dựng này bằng cách đệ quy tìm kiếm một lớp .__subclasses__() kết quả phương pháp, sử dụng chức năng này (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 

Đặt này với nhau:

list_of_classes = get_subclasses(int) 
print_class_hierarchy(list_of_classes) 

nào in (bằng 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 

Điều này cung cấp cho chúng ta một cây thuộc tất cả các lớp con, cũng như các lớp thừa kế liên quan nhiều lần - và cho chúng ta biết các mô-đun mà chúng đang sống.

Các vấn đề liên quan