Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:打印嵌套类_Python_Class_Printing_Nested - Fatal编程技术网

Python:打印嵌套类

Python:打印嵌套类,python,class,printing,nested,Python,Class,Printing,Nested,打印嵌套类内容的最佳方法是什么?例如: class Library(): def __init__(self): self.shelves = [] self.shelf = self.Shelf() class Shelf(): def __init__(self): self.books = [] x = Library() 我知道如果类不是嵌套的,vars(x)可以工作。但如果是的话,我会得到这

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

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

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

其次,您看到的正是您应该看到的:
shelf
变量的值是一个
shelf
对象,您没有为它定义任何特殊的外观(或“复制”)。由于
vars
不是递归的,因此可以看到带有内存位置的默认外观

如果要在打印
工具架
对象时查看
工具架
对象上的
vars()
调用的内容,可以为
工具架
定义一个调用
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))


您的目标是拥有对象的字符串版本。Python知道两种方法:
\uuuu repr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。第一个是字符串,如果将其解释为Python源代码,将重新生成它所表示的内容。如果您只调用
vars(x)
您将收到给定
x
中所有字段的
dict
。大多数方法都是输出这个
dict
(可能也是您的)使它调用其每个内容的
\uuuu repr\uuuu()
函数。这就是为什么您会看到丑陋的字符串
,因为这是
工具架
对象的
\uu repr\uu()

我建议实施它,从而覆盖标准实施。您必须在
工具架中执行此操作:

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()
当你这样做的时候,你也可以在你的
库中做同样的事情;然后单独键入
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()

谢谢,这正是我想要的。如果每个类都有我需要构建的参数,我会使用嵌套类来分解每个类。这对轻松打印出我需要的内容有很大帮助,谢谢。
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()