pythonの特殊メソッドの呼ばれ方についての質問です。
例えば、
x + y
を実行した時、
x.__add__(y)
の特殊メソッドが呼ばれると思うのですが、
xの__add__をオーバーロードしてなくて、
yの__radd__をオーバーロードしている場合、
後のオーバーロードした+演算子で解釈される様なのですが、
通常の+の演算子で解釈されるのは、両方の変数(オビジェクト)ともにオーバーロードされていない時という理解でいいのでしょうか?
左辺がオーバーロードされてない時、通常の+演算子、
x.__add__(y)を読み出した時点で、yが通常の変数では無いので、この時点でエラーになる様な気もするので質問しています。
どの様に理解するのがいいのでしょうか?
No.3
- 回答日時:
> 1 + 2
> は、
> 1のint型には、__add__メソッドは実装されていない、
> 2のint型には、__radd__メソッドは実装されていない
確認しましたか?
>>> a=1
>>> a.__class__
<type 'int'>
>>> dir(a)
['__abs__', '__add__', (略) , '__radd__', (略) ]
>>> a.__add__(2)
3
No.4ベストアンサー
- 回答日時:
> 1.__class__
> や
> 1.__add__(2)
> はSyntaxErrorになる様ですが、何が悪いのでしょうか?
浮動小数点数リテラル ( 1.5 とか)の書式の方が優先され、. が小数点と解釈されています。
そのため、続く文字が「浮動小数点数リテラルとしては不正な文字」なためSyntaxError(文法間違い)になります。
(1).__class__
等と括弧でくくるとか、変数と束縛するとかすれば、属性へのアクセスと解釈されます。
> +の後の方のオブジェクトをオーバーロードした時、
> 1 + オーバーロードしたオブジェクト
> とすると、
> 左辺の1の通常の__add__()が呼び出されてエラーになる様な気がするのですが、
https://docs.python.org/ja/3/reference/datamodel …
https://qiita.com/tell-k/items/ec64a82e7883cb00a …
演算子 + は単純な __add__ / __radd__ メソッドへの置き換えではありません。
a + b で __radd__ が呼ばれるのは次のときです。
・a.__add__ メソッドの無い
・a.__add__(b) メソッドが NotImplemented を返した
・b が aのサブクラス、かつ b.__radd__ が定義されている
1 + オーバーロードしたオブジェクト
↓
(1).__add__(オーバーロードしたオブジェクト)
→ NotImplemented
↓
オーバーロードしたオブジェクト.__radd__(1)
という動作をしています。
>>> class cc:
...□def __radd__(self,x):
...□□print("__radd__ -> 5")
...□□return 5
...
>>> c=cc()
>>> c.__class__
<class '__main__.cc'>
>>> dir(c)
[(略), '__radd__',(略)]
>>> 1 + c
__radd__ -> 5
5
>>> (1).__add__(c)
NotImplemented
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- C言語・C++・C# pythonで外部のファイルを読み込む際のエラー 2 2022/04/12 19:22
- 発達障害・ダウン症・自閉症 中学の時にIQ82の境界知能と診断されました。 今の私も、やはり境界知能でしょうか? そしてこれは、 3 2023/02/19 00:37
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- エクストリームスポーツ 強い人間が自分の力が全く通用せずなす術もなく死ぬアニメ 1 2023/08/04 19:19
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JTableで値を右寄せ表示する方法
-
[ASP.NET]DropDownListのDB連携...
-
VB.NETでのnothing の意義について
-
JSPでのArrayListの表示につい...
-
VBAでの[]
-
GridViewに行追加するには?
-
エクセルVBA 画像を貼り付ける...
-
servletからjspへオブジェクト...
-
String型からlong型への変換は...
-
サーブレットコンテキストの意...
-
javaで配列の中身を表示する方法
-
オブジェクトの参照渡しについて
-
★Java1.5 オブジェクトのソー...
-
引数のないhasOwnProperty
-
エクセルVBA/SpecialCellsで特...
-
javaで、オブジェクトを生成し...
-
ピクチャーボックスに点を打つ...
-
vectorの内容をString型に変換...
-
VB.netでメソッドからコントロ...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでの[]
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
Vba ListViewの行挿入に関して...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
VBスクリプトでテキストファイ...
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
エクセルVBA/SpecialCellsで特...
-
getParameter()について
-
VBS でのソート処理Excel2003
おすすめ情報
1 + 2
は、
1のint型には、__add__メソッドは実装されていない、
2のint型には、__radd__メソッドは実装されていない
のに何故、TypeErrorにならないのですか?
ちょっと教えてください。
dir(1)
とすると、同じ様に、
['__abs__', '__add__', (略) , '__radd__', (略) ]
と表示されますが、
1.__class__
や
1.__add__(2)
はSyntaxErrorになる様ですが、何が悪いのでしょうか?
また、
+の後の方のオブジェクトをオーバーロードした時、
1 + オーバーロードしたオブジェクト
とすると、
左辺の1の通常の__add__()が呼び出されてエラーになる様な気がするのですが、
実際には、オーバーロードオブジェクトの__radd__()が呼ばれて上手くいく様なのですが、
オーバーロードしたオブジェクトがあれば、そちらが優先されるみたいなルールってあるのですか?