2012-05-07 5 views
8

最近、Pythonでオペレータのオーバーロードについて学びました。次のことが可能かどうかを知りたいと思います。オペレータがオペレータの右側にあるオブジェクトでPythonでオーバーロードする

次の仮説/考案クラスを検討してください。

class My_Num(object): 
    def __init__(self, val): 
     self.val = val 
    def __add__(self, other_num): 
     if isinstance(other_num, My_Num): 
      return self.val + other_num.val 
     else: 
      return self.val + other_num 

私は上記の書かれている方法は、私はこの

n1 = My_Num(1) 
n2 = My_Num(2) 
n3 = 3 
print n1 + n2 
print n1 + n3 

のようなものを行うことができますし、期待通りに、それらが動作することを知っています。また、私はこの

n1 = My_Num(1) 
n2 = 2 
print 2 + n1 

を行うことはできませんそれは現在書かれている方法は、この問題を回避とにかくがあることを知っていますか?私はこの例が考案されていることを知っていますが、オペレータのオーバーロードを行ったときに、オペレータを定義するクラスをオペレータの右側に表示することができれば、非常に便利なアプリケーションがあります。これはPythonで可能ですか?

答えて

9

はい。たとえば、__radd__があります。また、、__ge__()などのthere are noneのように、__lt__だけを定義した場合、a > bはの機能を呼び出し、回避策を提供します。少なくともいくつかのケースでは、このような何かをするのが妥当だと

>>> class My_Num(object): 
...  def __init__(self, val): 
...   self.val = val 
...  def __radd__(self, other_num): 
...   if isinstance(other_num, My_Num): 
...    return self.val + other_num.val 
...   else: 
...    return self.val + other_num 
... 
>>> n1 = My_Num(1) 
>>> n2 = 3 
>>> 
>>> print n2 + n1 
4 
>>> print n1 + n2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'My_Num' and 'int' 

注:

>>> class My_Num(object): 
...  def __init__(self, val): 
...   self.val = val 
...  def __add__(self, other_num): 
...   if isinstance(other_num, My_Num): 
...    return self.val + other_num.val 
...   else: 
...    return self.val + other_num 
...  __radd__ = __add__ 
+0

ありがとう)それを可能にするのは__radd__だけですか?アプリケーションのためにオーバーロードする必要がある特定の演算子は、>>演算子と<<演算子です。私はその運営者のためにこれをやりたいのですか? – martega

+0

あなたはリンクをクリックしましたか? '__rrshift__'などがあります。 – senderle

+1

各クラスに対してどの演算子が定義されているかを制御することで、限られた範囲で比較することは可能です。例えば、AとBは__lt__しか定義されていません。 A Aは、リトルエンドに属するメソッドを呼び出します。 –

1

あなたは__radd__法(右側の追加)をオーバーロードする必要があります。あなたの関数は、__add__メソッドとほとんど同じに見えるはずです(例:

def __radd__(self, other): 
    return self.val + other.val 
関連する問題