2016-11-15 115 views
-4

(Python的3.5.2)如何使用具有多個參數的__repr__?

我已經爲我的一個類定義__repr__如下:

class d(): 
    def __init__(self): 
     self._values = [] 
     return 
    def __pos__(self): 
     return self._values[0] 
    def __repr__(self, value): 
     self._values.append(value) 
     return 

現在我想

x = d() 
print(x,"a") 
print(+x) 

返回

a

但相反,我得到

TypeError: __repr__() missing 1 required positional argument: 'value'

我已經嘗試了一些變化,如print(x),"a"沒有運氣。

+7

...'__repr __()'不採取任何* *參數... –

+0

和你的函數返回一個字符串,沒有什麼。 init不需要返回語句 –

+0

(儘管從__init __()')返回什麼都沒有,或者至少是'None') –

回答

1

您以錯誤的方式使用__repr__。應該使用__repr__以可打印,格式化的方式返回對象的表示形式。與Python簡單地打印對象的名稱和內存地址相反。根據__repr__的文檔:

repr()調用內置函數來計算對象的「官方」字符串表示形式。如果可能的話,這應該看起來像一個有效的Python表達式,可用於重新創建具有相同值的對象(給定適當的環境)。如果這是不可能的,一個形式爲<的字符串...應該返回一些有用的描述。返回值必須是一個字符串對象。如果一個類定義了__repr__()而不是__str__(),那麼當需要該類的實例的「非正式」字符串表示時,也使用__repr__()

我真的不確定你想用__repr__達到什麼效果。如果你只是想一個元素通過的d方法添加到self.values,溝魔術方法和剛剛創建自己:

class d(): 
    def __init__(self): 
     self._values = [] 

    def __pos__(self): 
     return self._values[0] 

    def append(self, value): # create your won function 
     self._values.append(value) 
2

如果你要控制你的類的實例顯示,以正確的方式這樣做是否覆蓋__format__方法。一般來說,您可以覆蓋的三種方法用於:

  1. __repr__ - 當對象需要在交互式解釋器中顯示時使用,通常用作調試幫助。儘可能地,它應該是一個字符串,可以在評估時重新創建對象。
  2. __str__ - 當對象被傳遞給str或調用時print嘗試以顯示你的對象使用。沒有另一個定義,它只是調用__repr__。這是一個實例的「默認」字符串表示。
  3. __format__ - 當您的對象是參數str.format時使用。它作爲附加參數接收在替換字段中出現在可選:之後的格式規範(如果有)。

這裏是一個類的一個簡單的例子來表示對數字。用於分隔數字的字符可以通過格式規範進行配置。

class Pair(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __format__(self, spec): 
     return "{}{}{}".format(self.x, spec, self.y) 

    def __str__(self): 
     return "{:/}".format(self) 

    def __repr__(self): 
     return "Pair({}, {})".format(self.x, self.y) 

可以使用如下:

>>> x = Pair(1,2) 
>>> x # using __repr__ 
Pair(1, 2) 
>>> str(x) # using __str__, with a default separator of/
'1/2' 
>>> print(x) # uses __str__ implicitly 
1/2 
>>> "{}".format(x) # no separator specified 
'12' 
>>> "{:-}".format(x) # use - to separate the two numbers 
'1-2' 
相關問題