私はPythonでベクトルを表現するためのクラスを作成しました(練習問題として)、組み込み演算子の拡張に問題があります。ユーザ定義の__mul__メソッドは可換ではありません
ベクタークラスのために__mul__
メソッドを定義しました。問題は、式x * y
では、インタプリタが__mul__
というxのメソッドであり、yではないということです。
したがってvector(1, 2, 3) * 2
は、ベクトル< 2、4,6>を返します。 2 * vector(1, 2, 3)
は、組み込みのintクラスがユーザー定義のベクトルによる乗算をサポートしていないため、TypeErrorを作成します。
私は単に
def multiply(a, b):
try:
return a * b
except TypeError:
return b * a
新しい乗算機能を書き込むことによって、この問題を解決することができますが、これは私が私のユーザー定義クラスで使用するすべての関数を再定義が必要となります。
組み込み関数でこれを正しく処理する方法はありますか?
を探していると信じてどのようにPythonは 'Fooの.__ rmul__'はなく、他のオブジェクトの' __mul__'を呼び出すために知っているのですか? –
左側の '__mul__'を使用しようとしますが、見つからない場合は右側の' __rmul__'を探します。 –
@pstの場合、Pythonはまず '__mul__'を呼び出しますが、存在しないか、' NotImplemented'を返すと、Pythonは他のオブジェクトの '__rmul__'を呼び出します。 ( '__mul__'が実行を呼び出すと、' __rmul__'は__not__が呼び出されることに注意してください。 –