質問するログイン新規登録

Q&A

解決済

1回答

556閲覧

特殊メソッドの処理の考え方

kaiserdoragon

総合スコア21

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/01/05 18:01

編集2020/01/06 02:40

0

0

https://blog.codecamp.jp/python-class-code

こちらのサイトにあるサンプルの

class ADD(): def __init__(self, value): self.value = value def __add__(self, other): return self.value + other.value + 1 x = ADD(10) y = ADD(20) print(x + y)

なのですが出力が恐らく31になると思うのですが、その処理の過程が理解ができません。

・ADD(10)ということはself.value=10
・ADD(20)ということはself.value=20
・print(x+y)の時に+演算子があるので__add__(self,other)が発動??
→違うサイトで+演算子のオーバーライドという記載があったためこのように理解しているつもりです。

しかしここからどのようにして考えればいいのかがわかりません。
更に__add__(self,other)のotherは何を示しているのでしょうか??そしてother.valueは何を示しているのでしょうか??

ご教授お願い致します。

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

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

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

shiracamus

2020/01/06 00:54

コード部分を コードブロック で囲んで下さい。 そうしないと、インデントが正しく表示されませんし、アンダースコア2個が斜体指定として解釈されてしまいます。
kaiserdoragon

2020/01/06 02:41

ご指摘ありがとうございます! 修正して再度投稿させてもらいました! よろしくお願いします。
guest

回答1

0

ベストアンサー

Pythonインタープリタは、x + yx.__add__(y) と解釈して、変数 x に代入されているオブジェクトの __add__ メソッドを、変数 y に代入されているオブジェクトを引数にして呼び出します。
さらに x.__add__ メソッドは自分自身を第一引数にして、ADD.__add__(x, y) という形に変換してクラスに定義されている関数を呼び出します。
つまり、関数 ADD.__add__ の引数 self には x が、引数 other には y が引き渡されることになり、return x.value + y.value + 1 が実行され、return 10 + 20 + 1 となり、結果 31 という値が返されます。

python

1>>> class ADD: 2... def __init__(self, value): 3... self.value = value 4... def __add__(self, other): 5... return self.value + other.value + 1 6... 7>>> x = ADD(10) 8>>> y = ADD(20) 9>>> x + y 1031 11>>> x.__add__(y) 1231 13>>> ADD.__add__(x, y) 1431 15>>> x.value + y.value + 1 1631

1 + 2 も、内部的には 1 .__add__(2) から int.__add__(1, 2) が呼び出されています。(整数直後のドットは浮動小数点と解釈されてしまうため空白を入れています)

python

1>>> 1 + 2 23 3>>> 1 .__add__(2) 43 5>>> int.__add__(1, 2) 63

投稿2020/01/05 22:35

編集2020/01/06 01:41
shiracamus

総合スコア5413

hayataka2049

2020/01/06 01:58

いい回答だと思いますが、この内容ならリファレンスを参照した方が良いかもしれません。
kaiserdoragon

2020/01/06 03:10

とても丁寧にご回答頂きありがとうございます!! この内容がずっとわからずに考えていたのでとても助かりました。 お蔭で問題に対して理解ができました! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問