web-dev-qa-db-ja.com

Pythonクラスの文字列表現を変更するにはどうすればよいですか?

Javaでは、クラスのtoString()メソッドをオーバーライドできます。次に、Javaの印刷関数は、toString()で定義されたオブジェクトの文字列表現を印刷します。 JavaのtoString()に相当するPythonがありますか?

たとえば、PlayCardクラスがあります。 PlayCardのインスタンスcがあります。今:

>>> print(c)
<__main__.Card object at 0x01FD5D30>

しかし、私が欲しいのは次のようなものです:

>>> print(c)
A♣

クラスインスタンスの文字列表現をカスタマイズするにはどうすればよいですか?

Python 3.xを使用しています

186
snakile

JavaのtoStringに最も近いものは、クラスに__str__を実装することです。これをクラス定義に追加します。

def __str__(self):
     return "foo"

デバッグを支援するために__repr__を実装することもできます。

詳細については、こちらをご覧ください。

244
Mark Byers

これは見た目ほど簡単ではありません。一部のコアライブラリ関数は、strのみが上書きされた場合に動作しません(Pythonでチェックされます) 2.7)、例についてはこのスレッドを参照してください クラスJSONをシリアライズ可能にする方法 また、これを試してください

import json

class A(unicode):
    def __str__(self):
        return 'a'
    def __unicode__(self):
        return u'a'
    def __repr__(self):
        return 'a'

a = A()
json.dumps(a)

生産する

'""'

ではなく

'"a"'

予想どおり。

編集:mchicagoのコメントへの回答:

unicodeには属性がありません。これは不変の文字列であり、その値は非表示であり、高レベルPythonコードからは使用できません。 jsonモジュールは、reを使用して、この内部属性にアクセスしていると思われる文字列表現を生成します。これを正当化する簡単な例を次に示します。

b = A('b') print b

生産する

'a'

しながら

json.dumps({'b': b})

生産する

{"b": "b"}

そのため、おそらくパフォーマンス上の理由で、内部表現が一部のネイティブライブラリで使用されていることがわかります。

詳細についてはこちらもご覧ください: http://www.laurentluce.com/posts/python-string-objects-implementation/

31
seeg