2011-10-27 65 views
24

例如:我可以覆蓋namedtuple的字符串形式嗎?

>>> Spoken = namedtuple("Spoken", ["loudness", "pitch"]) 
>>> s = Spoken(loudness=90, pitch='high') 
>>> str(s) 
"Spoken(loudness=90, pitch='high')" 

我要的是:

>>> str(s) 
90 

這是我想要的字符串表示,以顯示音量屬性。 這可能嗎?

+1

也許你應該創建一個合適的可重用類。 – Oliver

回答

42

是的,這是不是很難做,有它在namedtuple docs爲例。

該技術是使一個子類,增加了其自身的STR方法:

>>> from collections import namedtuple 
>>> class Spoken(namedtuple("Spoken", ["loudness", "pitch"])): 
     __slots__ =() 
     def __str__(self): 
      return str(self.loudness) 

>>> s = Spoken(loudness=90, pitch='high') 
>>> str(s) 
'90' 
+9

這是什麼'__slots__'用法?它是必需的還是可選的? – clwen

+14

將'__slots__''設置爲空元組是一種節省內存的技巧。它確保''Spoken''實例與普通元組相同的內存量。沒有插槽條目,每個實例都需要自己的字典(比元組大得多)。 –

9

您可以定義一個函數爲它:

def print_loudness(self): 
    return str(self.loudness) 

並指定爲__str__

Spoken.__str__ = print_loudness 
+1

出於好奇,這是否會返回一個'integer'或'string',因爲你的重載'str'返回一個'int'? – Serdalis

+1

@Serdalis:好的,這會錯誤地返回一個'integer'。現在修復它。 –

+0

我喜歡這種方式,因爲它使用''namedtuple''的默認方式增加了很少的文本。你甚至可以使用lambda表達式來縮短它,而不會失去很多可讀性(恕我直言):''口語.__ str__ = lambda x:str(x.loudness)''。 (當然你可以在lambda表達式中使用['''''''''str.format(...)''](http://stackoverflow.com/q/5082452)。 – djlauk

4

你可以使用這樣的代碼:

from collections import namedtuple 

class SpokenTuple(namedtuple("Spoken", ["loudness", "pitch"])): 

    def __str__(self): 
     return str(self.loudness) 

s = SpokenTuple(loudness=90, pitch='high') 

print(str(s)) 

這將在一個類你選擇的包裹namedtuple其中那麼你也會重載str函數。