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()