Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python commutative operator override

Hi I was wondering if there is a way to do a symmetric operator override in Python. For example, let's say I have a class:

class A:
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.value + other.value
        else:
            return self.value + other

Then I can do:

a = A(1)
a + 1

But if I try:

1 + a

I get an error. Is there a way to override the operator add so that 1 + a will work?

like image 790
Bob Sacamano Avatar asked Feb 06 '17 15:02

Bob Sacamano


1 Answers

Just implement an __radd__ method in your class. Once the int class can't handle the addition, the __radd__ if implemented, takes it up.

class A(object):
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.value + other.value
        else:
            return self.value + other

    def __radd__(self, other):
        return self.__add__(other)


a = A(1)
print a + 1
# 2
print 1 + a
# 2

For instance, to evaluate the expression x - y, where y is an instance of a class that has an __rsub__() method, y.__rsub__(x) is called if x.__sub__(y) returns NotImplemented.

Same applies to x + y.

On a side note, you probably want your class to subclass object. See What is the purpose of subclassing the class "object" in Python?

like image 196
Moses Koledoye Avatar answered Oct 25 '22 03:10

Moses Koledoye