2015-10-05 95 views
0

什麼是打印嵌套類內容的最佳方式?例如:Python:打印嵌套類

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

回答

3

首先,我會建議你不要嵌套類。沒有任何理由這樣做。

其次,你正在看到你應該怎麼做:shelf變量的值是Shelf對象,並且你沒有爲它定義任何特殊的外觀(或「再現」)。由於vars不是遞歸的,因此可以看到帶有內存位置的默認外觀。

如果你想看到一個vars()通話的內容Shelf物體上噴印的Shelf對象時,你可以定義Shelf一個__repr__方法本身調用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': []} 
+0

謝謝,這正是我所期待的。我使用嵌套類來分解每個類是否有我需要建立的參數。 – Laharl

2

您的目標是獲得對象的字符串版本。 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 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() 
+0

這是一個很容易打印出我需要的幫助,謝謝。 – Laharl