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
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to