Python:打印嵌套类

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)

Alf*_*lfe 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()
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)