I want to know what the difference between
self.a = 10
b = 20
The first is used to initialise newly created object, and receives arguments used to do that:
class foo: def __init__(self, a, b, c): # ... x = foo(1, 2, 3) # __init__
The second implements function call operator.
class foo: def __call__(self, a, b, c): # ... x = foo() x(1, 2, 3) # __call__