2011-10-27 19 views
24

名前付きタプルの文字列形式を上書きできますか?たとえば

>>> 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

は、あなたのオーバーロードされた 'str'が' int'を返すので、 'integer'か' string'を返しますか? – Serdalis

+1

@Serdalis:うんざりして、これは誤って整数を返します。今すぐ修正する。 –

+0

私はこの方法が好きです。なぜなら、 '' namedtuple''を使うデフォルトの方法にはほとんどテキストを追加しないからです。ラムダ式を使って読みやすさ(IMHO)を損なうことなく短縮することもできます: '' Spoken .__ str__ = lambda x:str(x.loudness) '' (もちろん、ラムダ式の中では ''% ''や '' 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関数もオーバーロードされます。

関連する問題