Name lookup inside class definition

Robert Lehmann stargaming at gmail.com
Wed Jun 18 02:32:58 EDT 2008


On Tue, 17 Jun 2008 23:05:56 -0700, WaterWalk wrote:

> Hello. Consider the following two examples: class Test1(object):
>     att1 = 1
>     def func(self):
>         print Test1.att1    // ok
> 
> class Test2(object):
>     att1 = 1
>     att2 = Test2.att1  // NameError: Name Test2 is not defined
> 
> It seems a little strange. Why a class name can be used in a method
> while cannot be used in the class block itself? I read the "Python
> Reference Manual"(4.1 Naming and binding ), but didn't get a clue.

It's because functions actually defer the name lookup. So you can use 
*any* name in a function, basically. If it's there at the function's 
runtime (not its declaration time), you're okay.

During the execution of a class body, the class is not yet created. So 
you're running this ``Test2.att1`` lookup already (it has to be executed 
*now*, during the class creation) and fail because the class is not there.

You can still refer to the class' scope as a local scope::

    >>> class A(object):
    ...  att1 = 1
    ...  att2 = att1 + 2
    ...
    >>> A.att1
    1
    >>> A.att2
    3

HTH,

-- 
Robert "Stargaming" Lehmann



More information about the Python-list mailing list