Python: 打印嵌套 类
Python: Printing nested classes
打印嵌套 class 内容的最佳方法是什么?例如:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
x = Library()
我知道如果 class 没有嵌套,vars(x) 就可以工作。但如果是的话,我会得到类似的东西:
{'shelf': <__main__.Shelf instance at 0x7f4bae723560>, 'shelves': []}
作为输出。如何让 python 将其打印为:
{'shelf': {'books': []}, 'shelves': []}
首先,我建议您不要嵌套类。确实没有任何理由这样做。
其次,您看到的正是您应该看到的:shelf
变量的值是一个 Shelf
对象,并且您没有定义任何特殊外观(或 "reproduction") 的。由于 vars
不是递归的,您会看到带有内存位置的默认外观。
如果要在打印 Shelf
对象时查看对 Shelf
对象的 vars()
调用的内容,可以为 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': []}
您的目标是拥有对象的字符串版本。 Python 知道两种方法:__repr__()
和 __str__()
。第一个是一个字符串,如果将其解释为 Python 源,将重新生成它所代表的内容。如果您只调用 vars(x)
,您会收到给定 x
中所有字段的 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:
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()
打印嵌套 class 内容的最佳方法是什么?例如:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
x = Library()
我知道如果 class 没有嵌套,vars(x) 就可以工作。但如果是的话,我会得到类似的东西:
{'shelf': <__main__.Shelf instance at 0x7f4bae723560>, 'shelves': []}
作为输出。如何让 python 将其打印为:
{'shelf': {'books': []}, 'shelves': []}
首先,我建议您不要嵌套类。确实没有任何理由这样做。
其次,您看到的正是您应该看到的:shelf
变量的值是一个 Shelf
对象,并且您没有定义任何特殊外观(或 "reproduction") 的。由于 vars
不是递归的,您会看到带有内存位置的默认外观。
如果要在打印 Shelf
对象时查看对 Shelf
对象的 vars()
调用的内容,可以为 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': []}
您的目标是拥有对象的字符串版本。 Python 知道两种方法:__repr__()
和 __str__()
。第一个是一个字符串,如果将其解释为 Python 源,将重新生成它所代表的内容。如果您只调用 vars(x)
,您会收到给定 x
中所有字段的 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:
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()