On 02/09/2012 02:23 PM, Tonu Mikk wrote:
On Mon, Feb 6, 2012 at 12:58 PM, Dave Angel<d...@davea.name>  wrote:

On 02/06/2012 01:24 PM, Tonu Mikk wrote:

Now I get an error:  NameError: global name 'self' is not define.

Tonu


  Put your remarks after the stuff you quote.  You're top-posting, which
makes the reply difficult to follow.

Use copy/paste to describe an error message.  You retyped the one above,
and added a typo.  Include the whole error, which includes the stack trace.

If you had followed Nate's advice, you couldn't have gotten that error at
all, so you'll also need to post the code that actually triggers the error.


Let's try this one more time.  I thought that I would try to make Alan's
code work.  Here is the version what I have now:

class Printer:
   def __init__(self,number=0):
      self.value = number
   def sayIt(self):
      print self.value

class MyApp:
   def __init__(self, aPrinter = None):
       if aPrinter == None:     # if no object passed create one
          aPrinter = Printer()
       self.obj = aPrinter      # assign object
   def doIt():
       self.obj.sayIt()         # use object

def test():
   p = Printer(42)
   a1 = MyApp()
   a2 = MyApp(p)   # pass p object into a2
   a1.doIt(self)   # prints default value = 0
   a2.doIt(self)   # prints 42, the value of p

test()

When I run it, I get an error:
Traceback (most recent call last):
   File "alan_class.py", line 22, in<module>
     test()
   File "alan_class.py", line 19, in test
     a1.doIt(self)   # prints default value = 0
NameError: global name 'self' is not defined


Very good.  Now I can see the problem(s).

The immediate problem is that inside function test() (which is an ordinary function, not a method), you refer to self, which is not defined there. just omit it there (both times), since the "self" value will automatically be supplied when you use the a1.doIt() syntax.

Which takes me to the next problem. You've defined a method inside class MyApp, without supplying the self parameter. All methods of a class will have a 'self' parameter as the first argument (until you get to classmethod and staticmethod, which come much later in your learning). You have it everywhere else, but not here.

This is admittedly a confusing aspect of class programming in Python. When you call a method, you do not supply an explicit self, it's implied by the object you used to get that method. And in the method, you do have to declare an explicit self as the first parameter. Thus when you get error messages, the compiler's concept of how many arguments there are, and how many there should be, is confusing.

Trust me when I say there are reasons why this should be, having to do with passing bound methods around. But at this point of your learning, it's a confusion with no obvious benefit.

Without trying it, here's what I think those two portions of coee should look like:

class MyApp:
   .....
  def doIt(self):
      self.obj.sayIt()         # use object

def test():
  p = Printer(42)
  a1 = MyApp()
  a2 = MyApp(p)   # pass p object into a2
  a1.doIt()   # prints default value = 0
  a2.doIt()   # prints 42, the value of p



--

DaveA
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to