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)
通过让您的类从实现该__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 及更高版本。
以下递归函数使用__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)
| 归档时间: |
|
| 查看次数: |
3351 次 |
| 最近记录: |