[Tutor] Self, Scopes and my unbelievable muddleheadedness.
Alan Gauld
alan.gauld at btinternet.com
Fri Oct 27 01:07:05 CEST 2006
Replying to my own post, how sad...
"Alan Gauld" <alan.gauld at btinternet.com> wrote
> First we need a way to create objects since we dont have
> classes...so we write a function that returns a dictionary.
> We'll make it simple and have a message class that stores
> a string and has a display method.
>
> def display(aMessage):
> print aMessage['text']
>
> def Message(theText):
> theObject = {}
> theObject['text'] = theText
> return theObject
Oops I lost the plot somewhere here, the create function
should have been called createMessage and looked like:
def createMessage(theText):
theObject = {}
theObject['text'] = theText
theObject['display'] = display
return theObject
> Now we create a couple of instances and display them:
>
> m1 = createMessage('Good morning')
> m2 = createMessage('Hello world')
>
> display(m1)
> display(m2)
And the display calls should have been via the dictionary:
m1['display'](m1)
m2['display'](m2)
> Notice how we need to pass the instance that we want
> to display into the display call?
And that should make more sense and be closer to the true
OOP version...
> Now lets write the same thing using real OOP:
>
> class Message:
> def __init__(self, theText):
> self.text = theText
> def display(self):
> print self.text
>
> m1 = Message('Good morning')
> m2 = Message('Hello world')
> Message.display(m1)
> Message.display(m2)
>
> If you compare the definition of the display function and
> the definition of the display method can you see the similarity,
> and the correspondence of self to aMessage?
>
> Now look at the two calls to display in the real OOP example.
> Can you see the similarity to the calls to display in the non OOP
> version?
>
> Again can you see the correspondence between the values
> passed in to the function and the values passed via the class.
> In both cases its m1,m2, ie the instances we created.
> In both cases the function needs those values to know
> which objects message it should print.
>
> Finally we have the more conventionalOOP notation for calling
> methods:
>
> m1.display()
> m2.display()
>
> These are exactly the same as the previous calls via the
> Message class, but are more intuitive (once you start
> feeling comfortable with OOP notation as used with strings
> and the like)
>
> I've never tried explaining self with that set of examples so
> it may have confused things even more! But maybe its more
> conventional approach to functions v methods might make sense.
>
> The final caveat is that message dispatch gets more complex
> when you factor in inheritance so the simple non OOP example
> breaks down fairly quickly...
>
> HTH,
>
>
> --
> Alan Gauld
> Author of the Learn to Program web site
> http://www.freenetpages.co.uk/hp/alan.gauld
More information about the Tutor
mailing list