Python:打印嵌套类

时间:2015-10-05 22:07:28

标签: python class printing nested

打印嵌套类的内容的最佳方法是什么?例如:

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': []}

2 个答案:

答案 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))