x + y は x.__add__(y) だと思っていたのですが、そうではないのでしょうか?
違います。
そのようにインプリメントしてあると、後で新しい数型を追加した場合にxの__add__メソッドにその型を追加する必要があります。
例えばnumpyには numpy.int32というクラスがあります。これを扱うために、基本のPythonのint型の__add__にnumpy.int32のことを追加しなければならないのであれば、追加モジュールが作成されるごとに基本のPythonのint型の__add__の変更が必要となり、モジュールの追加がとても難しくなります。
そうならないように、x + y はまず、x.__add__(y)を試してみます。それが成功すればその結果を返しますが、失敗した場合はy.__radd__(x)を試します。それが成功すればその結果を返します。両方とも失敗した場合には、TypeErrorの例外を上げます。
つまり、整数と整数の足し算の方法は左の整数が知っているけれども、整数と浮動小数点数の足し算は、左の整数がやり方を知らないので、右の浮動小数点数にできるかどうかを確かめ、右の浮動小数点数がやり方を知っていたので、計算ができる、という仕組みで動いているのです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/26 05:57
2021/10/26 06:32