Operator overloading in python with the object on the right hand side of the operator

前端 未结 2 1799
刺人心
刺人心 2020-12-07 00:43

I recently learned about operator overloading in python and I would like to know if the following is possible.

Consider the folowing hypothetica/contrived class.

2条回答
  •  情歌与酒
    2020-12-07 01:30

    Yes. For example, there is __radd__. Also, there are none for __le__(), __ge__(), etc., but as Joel Cornett rightly observes, if you define only __lt__, a > b calls the __lt__ function of b, which provides a workaround.

    >>> 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 "", line 1, in 
    TypeError: unsupported operand type(s) for +: 'My_Num' and 'int'
    

    Note that in at least some cases it's reasonable to do something like this:

    >>> 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__
    

提交回复
热议问题