Python 漂亮打印嵌套对象

dks*_*551 5 python pretty-print

我有 3 个 python 类 A、B 和 C。A 包含 B 对象,B 包含 C 的对象。我想要的是当我打印一个类对象时,它应该以下面的格式打印。C类内部也可以有更多的嵌套。

A:
    loc : XYZ
    qual : ABC
    b :
        name : ABC
        age : 30
        c :
            address : ABC
            phn : 99009
Run Code Online (Sandbox Code Playgroud)

以下是可供参考的类。

class C(object):
    def __init__(self):
        self.address='ABC'
        self.phn=99009

class B(object):
    def __init__(self):
        self.name='ABC'
        self.age=30
        self.c = C()

class A(object):
    def __init__(self):
        self.loc = 'XYZ'
        self.qual = 'ABC'
        self.b = B()
Run Code Online (Sandbox Code Playgroud)

jmd*_*_dk 7

通过让您的类从实现该__str__方法的公共基类继承来执行以下操作:

class PrettyPrinter(object):
    def __str__(self):
        lines = [self.__class__.__name__ + ':']
        for key, val in vars(self).items():
            lines += '{}: {}'.format(key, val).split('\n')
        return '\n    '.join(lines)

class C(PrettyPrinter):
    def __init__(self):
        self.address='ABC'
        self.phn=99009

class B(PrettyPrinter):
    def __init__(self):
        self.name='ABC'
        self.age=30
        self.c = C()

class A(PrettyPrinter):
    def __init__(self):
        self.loc = 'XYZ'
        self.qual = 'ABC'
        self.b = B()

a = A()
print(a)
Run Code Online (Sandbox Code Playgroud)

在 Python 3.6 和更新版本中,这显示为

A:
    loc: XYZ
    qual: ABC
    b: B:
        name: ABC
        age: 30
        c: C:
            address: ABC
            phn: 99009
Run Code Online (Sandbox Code Playgroud)

请注意,所有属性都会自动打印。它们的打印顺序是由vars函数决定的,它确实在__dict__字典中查找。该字典在 Python 3.5 及更低版本中具有不确定的顺序,因此打印输出几乎不如 3.6 及更高版本。


Joe*_*don 6

以下递归函数使用__dict__attr从头开始工作。的类来获取key:value类的属性对。从这里开始,我们只是测试该值是否是另一个类(在这种情况下我们再次调用自己),否则我们只需以您想要的格式打印它。

唯一要跟踪的另一件事是该行当前正在打印的级别的当前缩进。这可以通过indent我们在每次递归之前递增的默认参数 ( )轻松完成。

def pretty_print(clas, indent=0):
    print(' ' * indent +  type(clas).__name__ +  ':')
    indent += 4
    for k,v in clas.__dict__.items():
        if '__dict__' in dir(v):
            pretty_print(v,indent)
        else:
            print(' ' * indent +  k + ': ' + str(v))
Run Code Online (Sandbox Code Playgroud)

它有效:

>>> pretty_print(A())
A:
    loc: XYZ
    qual: ABC
    B:
        name: ABC
        age: 30
        C:
            address: ABC
            phn: 99009
Run Code Online (Sandbox Code Playgroud)