打印嵌套类的内容的最佳方法是什么?例如:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
x = Library()
我知道如果类没有嵌套,变量(x)可以工作。但如果是的话,我会得到类似的东西:
{'shelf': <__main__.Shelf instance at 0x7f4bae723560>, 'shelves': []}
作为输出。如何将python打印出来:
{'shelf': {'books': []}, 'shelves': []}
答案 0 :(得分:5)
您的目标是拥有对象的字符串版本。 Python知道两种方法:__repr__()
和__str__()
。第一个是一个字符串,如果解释为Python源,它将重新生成它所代表的东西。如果您只是致电vars(x)
,则会收到给定dict
中所有字段的x
。大多数意味着输出这个dict
(也可能是你的),使它调用每个内容的__repr__()
函数。这就是为什么你看到那个丑陋的字符串<__main__.Shelf instance at 0x7f4bae723560>
,因为那是__repr__()
对象的Shelf
。
我建议实现它,从而覆盖标准实现。您必须在Shelf
:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
def __repr__(self):
return repr(vars(self))
x = Library()
当你在这里时,你也可以在你的Library
中做同样的事情。然后单独输入x
(即代替vars(x)
)也会给出好的输出:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
def __repr__(self):
return repr(vars(self))
class Shelf():
def __init__(self):
self.books = []
def __repr__(self):
return repr(vars(self))
x = Library()
当然,你可以重构它并将该方面放入基类:
class Representer(object):
def __repr__(self):
return repr(vars(self))
class Library(Representer):
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf(Representer):
def __init__(self):
self.books = []
x = Library()
答案 1 :(得分:2)
首先,我建议您不要嵌套课程。没有任何理由这样做。
其次,您正好看到了您应该注意的内容:shelf
变量的值是Shelf
对象,并且您没有定义任何特殊外观(或“复制”) ) 为了它。由于vars
不是递归的,因此您会看到具有内存位置的默认外观。
如果要在打印vars()
对象时查看Shelf
对象上Shelf
调用的内容,可以为{{1}定义__repr__
方法在自身上调用Shelf
:
vars()
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
def __repr__(self):
return str(vars(self))