[Tutor] OOP help needed

Ben Finney ben+python at benfinney.id.au
Wed Jul 27 00:38:16 EDT 2016

Jim Byrnes <jf_byrnes at comcast.net> writes:

> So I decided to give it another try. When I got to the chapter on
> tkinter I decided to solve all the exercises using OOP even though the
> book solutions did not use OOP.

Hmm, that sounds ill advised.

OOP is one tool among many; trying to apply it where it's a poor fit
will result in bad design and probably avoidable errors.

When learning to use a hacksaw, trying to solve everything using that
tool merely to learn it, would be a poor choice.

> # exer2.py
> import tkinter
> class Count:
>   def __init__(self):
>     ''' Increment a button labeled 0, by 1 with each click '''
>     […]
>     self.count_btn = tkinter.Button(self.frame, textvariable=self.label,
>       command=lambda: self.increment(self.label ))

Here you address the ‘self.increment’ name, which should work.

>   def increment(self, label):
>     count = int(self.label.get())
>     self.label.set(str(count + 1))

This is the method that an instance will address via ‘self.increment’.

> In exer2.py if I do command=lambda: increment(self.label)

The lambda expression creates a function, and that function then behaves
like any other function. Within that function, the name ‘increment’ is
not defined; within the scope where the function was defined, the name
‘increment’ is also not defined. Within the global scope the name
‘increment’ is not defined.

So yes, you'll get NameError from that code.

> Why do I get this error?  The situations look the same to me

The difference is that when you invoke ‘self.instance’, the lookup of
‘self’ succeeds because it's defined within the function (you defined it
in the parameters of ‘__init__’, so ‘__init__’ knows that name when it
is running).

You never defined the name ‘increment’ within the function, nor within
the global scope. And you shouldn't because there's no need: you access
the instance's own method by accessing the instance first: you ask for
“the ‘instance’ attribute from the ‘self’ object”: ‘self.instance’.

 \             “I believe our future depends powerfully on how well we |
  `\     understand this cosmos, in which we float like a mote of dust |
_o__)                 in the morning sky.” —Carl Sagan, _Cosmos_, 1980 |
Ben Finney

More information about the Tutor mailing list