I have had the same problem, as a n00b.
The way I understyand it is if you have a function in a class, it is not required to use self (static method, vs, self based instance methods). But if it doesnt, it becomes completely contained in its 'scope' and cannot access data not directly passed to it. As a result, it would best be placed *outside* the class.
Self 'attaches' the function to the class and makes it a 'method'. It then has access to the other stuff in the class. It also apparently allows 'instances' (callers) ability to modify or even add to the functions data.
Although my first reaction to it was cruft baggage, in that there should be a default syntax that presumes it, so many other languages use 'self' or similar, that there must be an overriding reason to include this syntax.
There is also a class method which uses cls instead of self, but its beyond me for now!