__str __()を置き換えるのではなく拡張する

私のオブジェクトの __ str __()メソッドを拡張したいと思います。 str(obj)は現在次のようになります。


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


私は 'アドレスを格納する任意の属性を参照してください。私はPython 2.4.3を使用しています。

Edit: Would be nice to know how to do this with __repr__()

Solution (for python 2.4.3):

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,

2 答え

id(obj)でアドレスを取得できます。 __ str __()の代わりに __ repr __()メソッドを変更したいと思うかもしれません。 Python 2.6以降でこれを行うコードは次のとおりです:

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

テスト with:

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

古いバージョンのPythonでは、より明確な str.format()構文の代わりに、 "%s" のような文字列フォーマット操作を使用することで、簡単に同じことを行うことができます。 str.format()を使用する場合は、テンプレート内の {1:#x} を使用して組み込みの16進数フォーマット機能を使用することもできます引数1を hex(id(self))から単に id(self)に変更します。

5
追加された
完全な答えを得ようと編集しました。
追加された 著者 Michael Hoffman,
残りはどう?私はobj .__ class __.__ name__がTestを返しますが、モジュール名はどうですか?
追加された 著者 shadowland,
それがそれでした。あなたが提案したように%sを使用しなければなりませんでした。
追加された 著者 shadowland,
class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."
1
追加された
これは彼が望む出力を生成しません。彼はすべてのことを彼の例では角括弧内に入れることを望んでいます。これは、それ自身の角括弧のセットであるオリジナルを返し、その属性をそれらの "外側"に追加します。
追加された 著者 Brandon Buck,