Using language protocols in classes
All objects that provide a specific functionality have certain methods that facilitate that behavior, for example, you can create an object of type worker and expect it to have the submit_work(function, kwargs), and is _completed() methods. Now, we can expect all objects that have these methods to be usable as workers in any application portion. Similarly, the Python language has defined some methods that are needed to add a certain functionality to an object. If an object possesses these methods, it has that functionality.
We will discuss two very import protocols: iteration protocol, and context protocol.
Iteration protocol
For iteration protocol, objects must possess the __iter__ method. If the object possesses it, we can use the object anywhere that we use an iterator object. When we are using the iterator object in a for loop or passing it to the iter built-in function, we are calling its __iter__ method. This method returns another or the same object...