Lah*_*arl 1 python printing nested class
打印嵌套类的内容的最佳方法是什么?例如:
class Library():
def __init__(self):
self.shelves = []
self.shelf = self.Shelf()
class Shelf():
def __init__(self):
self.books = []
x = Library()
Run Code Online (Sandbox Code Playgroud)
我知道如果该类未嵌套,则vars(x)可以工作。但是,如果是这样,我会得到类似以下内容的信息:
{'shelf': <__main__.Shelf instance at 0x7f4bae723560>, 'shelves': []}
Run Code Online (Sandbox Code Playgroud)
作为输出。如何获取python将其打印为:
{'shelf': {'books': []}, 'shelves': []}
Run Code Online (Sandbox Code Playgroud)
您的目标是拥有对象的字符串版本。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()
Run Code Online (Sandbox Code Playgroud)
而且,当您使用它时,您也可以这样做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()
Run Code Online (Sandbox Code Playgroud)
当然,您可以将其重构并将其放入基类中:
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()
Run Code Online (Sandbox Code Playgroud)