2017-07-27 38 views
-1

有人可以幫助我爲什麼__repr__方法在下面的代碼中調用q.pop()方法嗎?爲什麼在下面的代碼中調用__repr__?

>>> class Item: 
...  def __init__(self, name): 
...   self.name = name 
...  def __repr__(self): 
...   return 'Item({!r})'.format(self.name) 
... 
>>> q = PriorityQueue() 
>>> q.push(Item('foo'), 1) 
>>> q.push(Item('bar'), 5) 
>>> q.push(Item('spam'), 4) 
>>> q.push(Item('grok'), 1) 
>>> q.pop() 
Item('bar') 
>>> q.pop() 
Item('spam') 
>>> q.pop() 
Item('foo') 
>>> q.pop() 
Item('grok') 
>>> 
+2

可能是一個好主意,把代碼中的問題不鏈接版權材料 – pointerless

+0

你會驅使我們瘋了,如果你不將代碼添加到您的問題。在每行代碼前添加一個額外的4個空格。 –

回答

2

內置__repr__函數用於返回對象的可打印格式。在這種情況下,因爲Item是自定義對象/類,因此__repr__中的覆蓋允許在終端中顯示Item的實例。看他們什麼時候打電話q.pop(),該項目被打印到屏幕上,並且該打印是通過覆蓋__repr__功能完成的。

q.pop()打印Item('bar')因爲覆蓋__repr__功能Item說打印'Item({!r})'.format(self.name)。這將打印單詞:Item(''),並且格式部分填充單引號之間的項目的實際內容,從而導致Item('bar')被打印到屏幕上。

瞭解更多關於此這裏: Purpose of Python's __repr__

+0

謝謝你的回答!我之前在這裏閱讀過關於__repr__的內容,但是我看不到的是__repr__函數的顯式調用。我的意思是如果它是一個__del__我可以理解顯式調用,因爲彈出對象將被刪除。但確切的問題是通過pop()調用__repr__的位置? –

+1

'pop()'函數返回一個'Item'。當你在python的'REPL'模式下調用一個函數時(即在終端中運行'python'時),任何函數的返回值都會打印到屏幕上。當打印返回值時,Python會自動調用'__repr__'將對象轉換爲可顯示給用戶的字符串。這是屏幕上顯示的結果。沒有明確的調用'__repr__',而是Python的'REPL'評估器的結果。 –

相關問題