繁体   English   中英

Python:打印嵌套类

[英]Python: Printing nested classes

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

class Library():
    def __init__(self):
        self.shelves = []
        self.shelf = self.Shelf()

    class Shelf():
        def __init__(self):
            self.books = []


x = Library()

我知道如果该类未嵌套,则vars(x)可以工作。 但是,如果是这样,我会得到类似以下内容的信息:

{'shelf': <__main__.Shelf instance at 0x7f4bae723560>, 'shelves': []}

作为输出。 如何获取python将其打印为:

{'shelf': {'books': []}, 'shelves': []}

您的目标是拥有对象的字符串版本。 Python知道两种方法: __repr__()__str__() 第一个是一个字符串,如果将其解释为Python源,它将重新生成它所代表的内容。 如果仅调用vars(x)则会收到给定x中所有字段的dict 输出此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 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()

首先,我建议您不要嵌套类。 确实没有任何理由这样做。

其次,您将确切地看到您应该得到的: shelf变量的值是一个Shelf对象,并且您尚未为其定义任何特殊外观(或“复制”)。 由于vars不是递归的,因此您会看到默认外观以及内存位置。

如果你想看到的内容, vars()一对叫Shelf打印物体时, Shelf对象,你可以定义一个__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))

>>> x = Library()
>>> vars(x)
{'shelf': {'books': []}, 'shelves': []}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM