21

ベクトル クラスがあり、ベクトル__mul__に数値を掛けるメソッドを定義しました。

__mul__メソッドは次のとおりです。

def __mul__(self, other):
    x = self.x * other
    y = self.y * other
    new = Vector()
    new.set_pos((x, y))
    return new

私の問題は、数値とベクトルのどちらがどちらであるかがわからないことです。self が数値の場合、self.x はエラーを発生させます。(私はおそらくこの点を誤解しています:「その他」は常に数字ですか?)

だから私はここで見つけました: Python: 私ができる乗算オーバーライド:

__rmul__ = __mul__

しかし、クラス定義でそれを行うにはどうすればよいですか?

何かのようなもの :

def __rmul__ = __mul__
4

3 に答える 3

26

self__mul__()メソッドが接続されているオブジェクトは数値ではなく、ベクトルであり、定義上は被乗数であるため、が数値になることはありません。

otherオブジェクトが数値で乗算されている場合、数値になります。または、別のベクトルなど、テストして処理できる別のものである可能性もあります。

オブジェクトが乗数の__rmul__()場合、被乗数が操作の処理方法を知らない場合に呼び出されます。

__mul____rmul__が同じメソッドである必要があるケースを処理するには、操作が交換可能であるため、クラス定義で割り当てを行うだけです。

class Vector(object):
    def __mul__(self, other):
        pass

    __rmul__ = __mul__
于 2012-06-29T15:54:08.520 に答える
14

属性としてリストするだけです。

__rmul__ = __mul__

これは、モジュールで関数のエイリアスを作成するのと同じ方法です。クラス本体内にメソッドのエイリアスを作成することも同じように機能します。

于 2012-06-29T15:49:00.223 に答える
4

要点は、Python ではオブジェクトに自分自身を乗算する方法を伝えることができるということです。つまり、

a * b

「自分自身を掛けるように指示する」または「自分自身をa掛けるように指示する」のいずれかを意味する可能性があります。コードでは、これは次のように変換されますbba

a.__mul__(b)

また

b.__rmul__(a)
于 2012-06-29T15:50:30.613 に答える