Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is it called operator overloading and not overriding in Python?

If I want to change the behavior of an inherited method, I would do something like this:

class a:
    def changeMe(self):
        print('called a')

class b(a):
    def changeMe(self):
        print('called b')

I believe this is an example of overriding in Python.

However, if I want to overload an operator, I do something very similar:

class c:
    aNumber = 0
    def __add__(self, operand):
        print("words")
        return self.aNumber + operand.aNumber

a = c()
b = c()
a.aNumber += 1
b.aNumber += 2
print(a + b) # prints "words\n3"

I thought that maybe the operator methods are really overridden in python since we overload using optional parameters and we just call it operator overloading out of convention.

But it also couldn't be an override, since '__add__' in object.__dict__.keys() is False; a method needs to be a member of the parent class in order to be overridden (and all classes inherit from object when created).

Where is the gap in my understanding?

like image 332
michen00 Avatar asked Jul 28 '17 15:07

michen00


2 Answers

I guess since the original question specifically asked about the gap in my own understanding, I am best-positioned to answer it. Go figure.

What I failed to understand was that whereas overriding depends on inheritance, overloading does not. Rather, Python matches methods for overloading based on name only.

For a subclass to override a method, the method does indeed need to exist in the parent class. Therefore, the def __add__ portion is not an example of overriding.

(In this case, I also did not fully understand that if the interpreter sees a + operator, it will look to the class of the operands for a definition of the __add__ magic method.)

Because the + operator is essentially an alias for __add__(), the same name is being used. Operator overloading is in fact an example of overloading because we are changing the behavior of the name (+ or __add__) when it is called with novel parameters (in my example, objects of class c).

like image 93
michen00 Avatar answered Oct 14 '22 19:10

michen00


Overloading means 2 methods with the SAME Name and different signatures + return types. Overriding means 2 methods with the SAME name, wherein the sub method has different functionality.The main difference between overloading and overriding is that in overloading we can use same function name with different parameters for multiple times for different tasks with on a class. and overriding means we can use same name function name with same parameters of the base class in the derived class. this is also called as re usability of code in the program.

like image 21
Dragon Avatar answered Oct 14 '22 21:10

Dragon