[Tutor] class methods: using class vars as args?

spir ☣ denis.spir at gmail.com
Thu May 27 21:49:42 CEST 2010


On Sun, 23 May 2010 15:40:13 -0400
Alex Hall <mehgcap at gmail.com> wrote:

> Hello all,
> I know Python reasonably well, but I still run into basic questions
> which those over on the other python list request I post here instead.
> I figure this would be one of them:
> Why would this not work:
> 
> class c(object):
>  def __init__(self, arg1, arg2):
>   self.arg1=arg1
>   self.arg2=arg2
> 
>  def doSomething(self, arg3=self.arg1):
>   ...
> 
> The above results in an error that "name 'self' is not defined". Why
> can I not set the default values of a method's arguments to class vars
> like that? Thanks!

Python gives you the answer (I'm not kidding): "name 'self' is not defined". "self" is not a magic name in python, unlike in some other languages, automagically receiving a value. It is just a name you can use for anything, like "self=1".

A *convention* tells that this name is used for the *target* of a message. For instance:
    l = [3,1,2]
    l.sort()
calls sort on the target l, which becomes the object on which sort applies. Right? Then, python magically (this is the only magic) adds l as first argument to the method sort of the list class, at call time. If sort were defined in python, its header could look like:
    def sort(target_list, compare_function=None):
The convention requires "target_list" to be rather called "self".

In your code, nowhere is a variable called "self" defined, before you try to use it. Since this happens in a class def, it should be first defined outside (probably in the global scope). If you write "self=1" somewhere before the class def, python will stop complaining about "self"... but it will complain about "arg1"!

A solution for what I guess you're trying to do is:
    def doSomething(self, arg3=None):
        if arg3 is None then arg3=self.arg1
The reason is that your default value, not only is not a constant, but is a variable depending on the actual instance, at call time. The only handle available to address an instance is precisely as target of a method call. So, you can only define something (here a default value) that depends on the instance from *inside* a method body, where the handle exists (magically brought by python).

Hope it's clear.


Denis
________________________________

vit esse estrany ☣

spir.wikidot.com


More information about the Tutor mailing list