Python objects can have special attribute names for easy operator overloading.
class StatefulFunction:
def __init__(self, state=0):
self.state = state
def __call__(self, x):
self.state += x
return self.state
def __add__(self, x):
return self.state + x
f = StatefulFunction(3)
f(2) # 5
f(2) # 7
f + 3 # 10, f.state is unchanged.
There are better ways of acheiving this particular example.