2016-07-21 3 views
1

私は新しいモジュラス7クラスを定義しました:クラス間の追加は第2引数のクラスによって評価できますか?

class mod7: 

    def __init__(self, n): 
     self.val = n % 7 

    def __repr__(self): 
     return str(self.val) 

In [2]: a = mod7(18) 

In [3]: a 
Out[3]: 4 

その後、私はちょうどMOD7ていないオブジェクトの追加を可能にしたかっただけでなく、新しいクラスの整数の。追加機能は第一引数のクラスによって呼び出された - なぜだから私はしかし

In [13]: 5 + a 
Traceback (most recent call last): 

    File "<ipython-input-13-14fd8adcbf4d>", line 1, in <module> 
    5+a 

TypeError: unsupported operand type(s) for +: 'int' and 'mod7' 

def __add__(self, other): 
     if type(other) is int: 
      return mod7(self.val + other) 
     if type(other) is mod7: 
      return mod7(self.val + other.val) 

In [11]: a + mod7(5) 
Out[11]: 2 

In [12]: a + 5 
Out[12]: 2 

を追加しましたクラスの下に私は理解しています。私の質問:aの2番目の引数のクラスに従って5 + aを上書きする方法はありますか?

+0

あなたのクラスに '__radd__'メソッドを追加することができます。しかしながら、通常、モジュラスは通常オペレータ上で定義されることに留意すべきである。それ以外の場合は、結果に第1引数または第2引数の係数があるはずですか? –

+0

@JaredGoguen - "演算子のモジュラスを定義する"とはどういう意味ですか?それはクラスで実装できますか? – Aguy

+0

(5%7)+(7%8)とは何ですか? 5(+%4)6 = 11%4 = 3のような方が理にかなっています。 –

答えて

2

__radd__も定義します。これは、の左オペランドが+をサポートしていない場合は自動的にと呼ばれますが、intsはこのような状況を処理するために特別に定義する必要があります。 __add__関数を呼び出すように定義すれば、何も書き換える必要はありません。

関連する問題