These are special methods surrounded by double underscores, such as __init__, __repr__, __str___ __setitem__, __getitem__, __enter__, __exit__, __add__, __mult__, __next__ and so on... The interpreter invokes them in certain situations, such as when creating an object, converting it to string via built-in str() function. They are used for operator overloading, i.e. to make expressions such as a + b or a * b, or a[ i ] work for custom defined classes and not just for numbers, or arrays. Minder
Overloading: you have different methods or functions with the same name. At compile time the compiler chooses which one to apply based on the types of the passed arguments.
Overriding: A base class has a method and a derived class redefines it with the same signature. The decision on which to use might happen at compile time or at dynamically runtime if the type of the object is only known then (dynamic dispatch). Minder