質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

562閲覧

repr()についてわかりません。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/01 11:56

編集2021/10/02 06:25

repr()でわからないこと
こちらのサイトで、

repr() メソッドを定義することで、この関数によりそのクラスのインスタンスが返すものを制御することができます。

とありました。また、同じサイトで

object.str(self)

オブジェクトの「非公式の (informal)」あるいは表示に適した文字列表現を計算するために、 str(object) と組み込み関数 format(), print() によって呼ばれます。戻り値は string オブジェクトでなければなりません。
str() が有効な Python 表現を返すことが期待されないという点で、このメソッドは object.repr() とは異なります: より便利な、または簡潔な表現を使用することができます。

とあります。

python

1def __str__(self): 2return repr(self.value)

の処理はどうなるのでしょうか?

下のプログラムは上でわからない部分のある参考にしたプログラムの一部です。

python

1 2class IOException(Exception): 3 #__int__(self):int()関数を使うときに呼び出されるメソッド 4 def __init__(self, value): 5 self.value = value 6 #__str__(self):str()関数,組み込み関数 format(), print() を使うときに呼び出されるメソッド 7 def __str__(self): 8 #repr()は引数付きのコンストラクタ(または初期化子)を文字列で返してくれる関数 9 return repr(self.value)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikapy

2021/10/01 14:37

repr() メソッド は __repr__() メソッド の間違いと思われるのでそうであれば修正願います。 質問は正確に!
quickquip

2021/10/01 23:34 編集

https://teratail.com/help#about-markdown 文章中のコード の記法を使って、`__str__` や `__repr__` と記載しましょう。 そうすると斜体にフォーマットされずに、まともに読めるようになります。
quickquip

2021/10/01 23:57 編集

最後のコードはどこからでてきましたか? 出典もしくはクラス全体のコードが書いてあるとそのクラスでのメソッドの意図を解説できる可能性があります(*)が、このメソッドだけ抜き出されているせいでそういう説明が不可能になっています。 (*)機能の説明のためのコードだと「どのように動くかを確認する」という意図かもしれません。そういうコードを見てこれは何の意味があるんだろう? と悩むのは不毛です。というような回答になるかもしれません。その場合はもうちょっと存在意義が実感できるコードが回答としてでてくる可能性もあります。
退会済みユーザー

退会済みユーザー

2021/10/02 06:26

変更しました。
guest

回答2

0

どうなると言われても、その書いてあるとおりで、self.valuereprselfstrとして返すだけですね。

投稿2021/10/01 13:28

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

うまく説明できるかどうかわかりませんが、やってみます。

pythonで、操作対象となるオブジェクトを、出力のために印字可能な表現にするためのメソッドが、__str__です。

操作対象となるオブジェクトを、pythonインタープリタ(eval())が読んでその同じ値を持つオブジェクトを生成できるような文字列を生成するメソッドが__repr__です。 repl関数は、引数のオブジェクトの__repr__メソッドを呼び出します。
pythonプログラムは文字列で書かれていて、pythonインタープリタで実行されますから、reprはそこでそのオブジェクトを表現するための書き方を示しているとも言えます。

pythn

1a = 10 2 3a.__str__() 4a.__repr__()

この2つは同じ文字列「10」を返します。
表示として10 と書いてあれば、数字の10であることはわかりますし、プログラムで書くときも、10 と書きますね。

python

1a = '10' 2 3a.__str__() 4a.__repr__()

この2つは違う値を返します。

__str__の方は、10 です。 文字列10は表示しても10ですからそのとおりでしょう。
__repr__は、 '10' を返します。前後にシングルクオーテーションが付きます。プログラムで文字列を表わるためには、前後を 「"」か「'」で囲わなければなりません。

pythonの仕様として、print(x)が呼ばれたとき

  • 'x.str' 'x.repr' 両方あれば'str'が呼ばれる
  • 片方しかなければそちらが呼ばれる

ようになっています。、

repr() メソッドを定義することで、この関数によりそのクラスのインスタンスが返すものを制御することができます。

何が表示されるかについては、作った人が好きに設定することができます。
__repr__で出力したものが定義どおりにならないものも沢山あります。関数は全てそうなります。

IOException の例は、そのインスタンスをprintで出力されたときに、何か表示しなければなりませんが、この実装では、そのオブジェクトが持っているvalue変数に束縛されているオブジェクトの持つ__repr__メソッドの返り値を返すことにしたのでしょう。str でなくて repr を選んだ理由はよくわかりませんが。

投稿2021/10/02 07:10

編集2021/10/02 07:11
TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問