At a loss on python scoping.

Dave Angel davea at davea.name
Tue Mar 26 11:07:44 CET 2013


On 03/26/2013 02:17 AM, Shiyao Ma wrote:
> Hi,
> suppose I have a file like this:
> class A:
>      r = 5
>      def func(self, s):
>          self.s = s
> a = A()
> print(a.r)    # this should print 5, but where does py store the name of r
>
> a.func(3)
> print(a.s)    # this should print 3, also where does py store this name.
> what's the underlying difference between the above example?
>

I don't think this is a scoping question at all.  These references are 
fully qualified, so scoping doesn't enter in.

The class A has a dictionary containing the names of r and func.  These 
are class attributes.  Each instance has a dictionary which will contain 
the name s AFTER the A.func() is called.  Ideally such an attribute will 
be assigned in the __init__() method, in which case every instance will 
have s in its dictionary.

When you use a.qqq  the attribute qqq is searched for in the instance 
dictionary and, if not found, in the class dictionary.  If still not 
found, in the parent classes' dictionary(s).

You can use dir(A) and dir(a) to look at these dictionaries, but it 
shows you the combination of them, so it's not as clear.  In other 
words, dir(a) shows you both dictionaries, merged.  (Seems to me dir 
also sometimes censors some of the names, but that's a vague memory. 
It's never left out anything I cared about, so maybe it's things like 
single-underscore names, or maybe just a poor memory.)


-- 
DaveA



More information about the Python-list mailing list