[Tutor] OOP clarification needed
Steven D'Aprano
steve at pearwood.info
Wed Jun 2 02:03:00 CEST 2010
On Wed, 2 Jun 2010 06:19:17 am Jim Byrnes wrote:
> Whenever I teach myself a new language I have great difficulty
> understanding the nuts and bolts of it's OO implementation. Compared
> to some older procedural languages I always end up becoming confused
> by the large number of built in methods. When reading through code
> examples I many times get hung up on trying to figure out just where
> some methods come from.
>
> Case in point is this code snippet from a chapter on Tkinter.
>
> def viewer(imgdir, kind=Toplevel, cols=None):
> """
> make thumb links window for an image directory:
> one thumb button per image; use kind=Tk to show
> in main app window, or Frame container (pack);
> imgfile differs per loop: must save with a default;
> photoimage objs must be saved: erased if reclaimed;
> """
> win = kind()
> win.title('Viewer: ' + imgdir)
> thumbs = makeThumbs(imgdir)
> <snip>
>
> What is the relationship between kind=Toplevel in the first line and
> win=kind() further down. Isn't "kind" a variable and "kind()" a
> method? I've probable overlooked something fundamental but a
> explanation would be appreciated.
This has nothing to do with object oriented programming. Apart from the
call to win.title(), there's nothing object oriented in this. The call
to kind() is not a method but a function call, no different from (say)
len(x) or cos(x), except that kind() takes no argument.
What you're actually getting confused by here is higher-order
programming.
In simple languages, you have two sorts of things: code (functions and
classes), and variables (data and instances), and they are completely
different stuff. Functions take data as arguments, operate on the data,
and produce new data. Here's a couple of examples from Python:
def plusone(x):
return x+1
def plustwo(x):
return x+2
Both functions take a single argument, which must be a number, does
something with that number, and returns a new number.
But in higher-order programming, we realise that functions themselves
can be data. You can write a function that takes a function as data,
operates on the function, and produces something new. Here's a trivial
example:
def print_table(func, start, stop):
print ' x =', # Note the comma.
results = []
for x in range(start, stop):
print x,
result = func(x)
results.append(result)
print
print 'f(x) =',
for item in results:
print item,
print
You then call this like:
print_table(plustwo, 1, 7)
and you get something like this:
x = 1 2 3 4 5 6
f(x) = 3 4 5 6 7 8
In the example you give, you have an argument named "kind". It is
expected to be some sort of function or class, and gets the default
value of TopLevel if not supplied. In the body of the function, this
function or class is called, to produce a value which is then
named "win". Judging by the default value and the name of the inner
variable, I would say it is expected to produce a window object, so any
function or class that returns a window object will be suitable.
--
Steven D'Aprano
More information about the Tutor
mailing list