I will demonstrate with code that does not use classes:
def state_init(state): state['field'] = 'init'def state_add(state, x): state['field'] += xdef state_mult(state, x): state['field'] *= xdef state_getField(state): return state['field']myself = {}state_init(myself)state_add(myself, 'added')state_mult(myself, 2)print( state_getField(myself) )#--> 'initaddedinitadded'
Classes are just a way to avoid passing in this "state" thing all the time (and other nice things like initializing, class composition, the rarely-needed metaclasses, and supporting custom methods to override operators).
Now let's demonstrate the above code using the built-in python class machinery, to show how it's basically the same thing.
class State(object): def __init__(self): self.field = 'init' def add(self, x): self.field += x def mult(self, x): self.field *= xs = State()s.add('added') # self is implicitly passed ins.mult(2) # self is implicitly passed inprint( s.field )
[migrated my answer from duplicate closed question]