__init__ vs. __call__ in Python

In Python, __init__ is called whenever a new instance of a class is created. The __call__ method is used to implement a function call operator.

If you create an instance of a class, like for example an agent instance of the class Agent, then, if the __call__ method is implemented, you can call the instance as any function call. You can make the call like this: agent(args). Doing so will execute the logic implemented in the body of the __call__ method

An object which implements the __call__ method is referred to as being “callable” om Python. I.e. this this case instances of the Agent class would be callable if the Agent class implements a definition of the __call__ method.