Although Martjin's answer is great, I'm going to expand on it, in some, let's say, "lower level" terms.
Basically, whenever you create a new GraphRegion object (myobject = GraphRegion(master)), __init__ is called with the new object as the first parameter (self), and the master argument as the second parameter.
Basically, if you do this:
myobject = GraphRegion(master)
__init__ get's called like this:
__init__(myobject, master)
This is because you often want to assign properties to specific instances of an object, and self lets you do that. For example, if I had a class Movie, where each instance of it had it's own title, I would use self like this:
class Movie(object):
def __init__(self, title):
self.title = title
That way, every instance of Movie can have it's own title.
Now, whenever you run Frame.__init__(self, master), that __init__ function often needs to modify the specific instance of the GraphRegion class you're creating (the object you're creating), and self is that instance, so you pass it to the __init__ method.