2012-06-29 30 views
14

私はベクタークラスを持っていて、ベクターに数値を掛けるには__mul__メソッドを定義しました。Pythonでメソッドエイリアスを定義しますか?

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

私の問題は、私は数とベクトルの間でどのであるかわからないということです。ここで

__mul__方法です。 selfが数値の場合、self.xはエラーを発生させます。 (私は多分この時点で勘違いしてる?:「その他」は常に数です):私は何ができるPython: multiplication override を:

だから私はここで見つける

__rmul__ = __mul__ 

が、私はAであることどのように行うことができますクラス定義?

のような何か:

def __rmul__ = __mul__ 

答えて

18

selfに変換する方法が接続されているオブジェクトが数ではありませんので、__mul__()で数になることはありません、それはベクトルだ、と定義によってそれはです被乗数。

otherは、オブジェクトに数値が乗算されている場合は数値になります。あるいは、それはあなたがテストして扱う別のベクトルのようなものかもしれません。

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

__mul____rmul__が同じメソッドである必要がある場合は、操作が可換であるため、クラス定義で代入するだけです。

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

    __rmul__ = __mul__ 
9

は、単に属性としてそれをリスト:

__rmul__ = __mul__ 

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

3

重要なことは、Pythonではオブジェクトに何かを乗算する方法を伝えることができます。それは

a * b 

は、どちらかの平均値「bによって自分自身を乗算するaを伝える」または「aによって自分自身を乗算するbを伝える」ことを意味します。コードでは、それは

a.__mul__(b) 

または

b.__rmul__(a) 
+0

どちらが呼び出されるかを知る方法はありますか? –

+1

'__mul__'を最初に実行し、失敗した場合は' __rmul__'を実行します。 – katrielalex

+3

better:または「bにそれを乗じて(b)を伝える」。乗算演算子は可換である必要はありません。 – glglgl

関連する問題