[英]Python: Printing nested classes
打印嵌套类的内容的最佳方法是什么? 例如:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
x = Library()
我知道如果该类未嵌套,则vars(x)可以工作。 但是,如果是这样,我会得到类似以下内容的信息:
{'shelf': <__main__.Shelf instance at 0x7f4bae723560>, 'shelves': []}
作为输出。 如何获取python将其打印为:
{'shelf': {'books': []}, 'shelves': []}
您的目标是拥有对象的字符串版本。 Python知道两种方法: __repr__()
和__str__()
。 第一个是一个字符串,如果将其解释为Python源,它将重新生成它所代表的内容。 如果仅调用vars(x)
则会收到给定x
中所有字段的dict
。 输出此dict
大多数方法(也可能是您的dict
)使它调用其每个内容的__repr__()
函数。 这就是为什么您看到丑陋的字符串<__main__.Shelf instance at 0x7f4bae723560>
原因,因为那是Shelf
对象的__repr__()
。
我建议实现它,从而覆盖标准实现。 您将必须在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()
首先,我建议您不要嵌套类。 确实没有任何理由这样做。
其次,您将确切地看到您应该得到的: shelf
变量的值是一个Shelf
对象,并且您尚未为其定义任何特殊外观(或“复制”)。 由于vars
不是递归的,因此您会看到默认外观以及内存位置。
如果你想看到的内容, vars()
一对叫Shelf
打印物体时, Shelf
对象,你可以定义一个__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))
>>> x = Library()
>>> vars(x)
{'shelf': {'books': []}, 'shelves': []}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.