2011-10-27 10 views
1

私のオブジェクトの__str__()メソッドを拡張したいと思います。 str(obj)は現在、読み取ります置き換えるのではなく__str __()を拡張する

<mymodule.Test object at 0x2b1f5098f2d0> 

私は一意の識別子としてアドレスを好むが、私はいくつかの属性を追加します。アドレス部分を維持しながらこれを拡張する最善の方法は何ですか?私はこのようなものを見たいと思います:

<mymodule.Test object at 0x2b1f5098f2d: name=foo, isValid=true> 

アドレスを格納する属性はありません。私はPython 2.4.3を使用しています。

編集は:__reprでこれを行う方法を知っておくとよいでしょう__()

ソリューション(のpython 2.4.3用):あなたがid(obj)でアドレスを取得することができ

def __repr__(self): 
    return "<%s.%s object at %s, name=%s, isValid=%s>" % (self.__module__, 
      self.__class__.__name__, hex(id(self)), self.name, self.isValid) 
+1

まず、古いPythonバージョンは使用しないでください。それ以外に、あなたがしようとしていることには '__repr__'があります。 – ThiefMaster

答えて

5

__str__()の代わりに__repr__()メソッドを変更することをお勧めします。以下のような操作を書式文字列を使用することにより、簡単にPythonの古いバージョンでのものと同じ種類の操作を行うことができ

test = Test() 
test.name = "foo" 
test.isValid = True 
print repr(test) 
print str(test) 
print test 

:で

class Test(object): 
    def __repr__(self): 
     repr_template = ("<{0.__class__.__module__}.{0.__class__.__name__}" 
         " object at {1}: name={0.name}, isValid={0.isValid}>") 

     return repr_template.format(self, hex(id(self))) 

テスト :ここ2.6+ Pythonでこれを実行するコードですstr.format()構文の代わりに"%s"を使用してください。 str.format()を使用する場合は、テンプレートに{1:#x}を使用し、引数1をhex(id(self))から単にid(self)に変更することで、組み込みの16進数フォーマット機能を使用することもできます。

+0

残りはどうなりますか?私はobj .__ class __.__ name__がTestを返しますが、モジュール名はどうですか? – shadowland

+0

編集して完全な回答を得ました。 –

+0

それはそれをしました。あなたが提案したように%sを使用しなければなりませんでした。 – shadowland

1
class Mine(object): 
    def __str__(self): 
     return object.__str__(self) + " own attributes..." 
+1

これは彼が望む出力を生成しません。彼はすべてのことを彼の例では角括弧内に入れることを望んでいます。これは、それ自身の角括弧のセットであるオリジナルを返し、その属性をそれらの "外側"に追加します。 –

関連する問題