human
I am working on the file "02-PythonWhirlwindCheatSheet.ipynb".
The first task is:
From http://www.programiz.com/python-programming/operator-overloading: Class functions that begins with double underscore (__) are called special functions in Python. To overload the + sign, we will need to implement __add__() function in the class.  What actually happens is that, when you do p1 + p2, Python will call p1.__add__(p2) which in turn is Point.__add__(p1,p2).   The reference gives a complete list of operators that can be overloaded, including: Addition + __add__, 
Subtraction - __sub__, 
Multiplication * __mul__, 
Power ** __pow__, 
Division / __truediv__, 
Floor Division // __floordiv__, 
Remainder  (modulo) % __mod__, 
Bitwise Left Shift &lt;&lt.
__lshift__, 
Bitwise Right Shift &gt;&gt.
__rshift__, 
Bitwise AND &amp.
__and__, 
Bitwise OR | __or__, 
Bitwise XOR ^ __xor__, and 
Bitwise NOT ~ __invert__.
Python does not limit operator overloading to arithmetic operators only. We can overload comparison operators as well.  Comparison operators that can be overloaded include:
Less than <  __lt__,
Less than or equal to   <= __le__,
Equal to ==  __eq__, 
Not equal to !=  __ne__, 
Greater than > __gt__, and
Greater than or equal to >= __ge__
Can you write Python program for it?

=====
Here actually happens is that, when you do p1 + p2, Python will call p1?
assistant
#Here actually happens is that, when you do p1 + p2, Python will call p1.

class Point:
    def __init__(self,x = 0,y = 0):
        self.x = x
        self.y = y
        
    def __str__(self):
        return "({0},{1})".format(self.x,self.y)
    
    def __lt__(self,other):
        self_mag = (self.x ** 2) + (self.y ** 2)
        other_mag = (other.x ** 2) + (other.y ** 2)
        return self_mag < other_mag
    
    def __add__(self,other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x,y)

p1 = Point(2,3)
p2 = Point(-1,2)
print(p1 + p2)
print(Point(1,1) < Point(-2,-3))