17

最近、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で可能ですか?

4

2 に答える 2

14

はい。たとえば、 があり__radd__ます。また、、などには何もありませんが、 Joel Cornett が正しく観察しているように、 のみを定義すると、回避策を提供するの関数が呼び出されます。__le__()__ge__()__lt__a > b__lt__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__
于 2012-05-07T23:46:35.530 に答える
2

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

def __radd__(self, other):
     return self.val + other.val
于 2012-05-07T23:50:38.840 に答える