29

Pythonでベクトルを表すクラスを(演習として)作成しましたが、組み込み演算子の拡張に問題があります。

__mul__ベクトルクラスのメソッドを定義しました。問題は、式x * yでインタプリタが__mul__yではなくxのメソッドを呼び出すことです。

したがって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

ただし、これには、ユーザー定義クラスで使用するすべての関数を再定義する必要があります。

組み込み関数でこれを正しく処理する方法はありますか?

4

2 に答える 2

36

異なる型の可換性が必要な場合は、実装する必要があります__rmul__()。実装されている場合は、すべての__r*__()特別なメソッドと同様に、そうでなければ操作で が発生する場合に呼び出されTypeErrorます。引数が入れ替わっていることに注意してください:

class Foo(object):
    def __mul_(self, other):
        ''' multiply self with other, e.g. Foo() * 7 '''
    def __rmul__(self, other):
        ''' multiply other with self, e.g. 7 * Foo() '''
于 2011-08-20T03:48:20.533 に答える
3

私はあなたが探していると信じています__rmul__

于 2011-08-20T03:49:09.533 に答える