At a loss on python scoping.
davea at davea.name
Tue Mar 26 11:07:44 CET 2013
On 03/26/2013 02:17 AM, Shiyao Ma wrote:
> 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
> 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.)
More information about the Python-list