John Posner wrote:
(My apologies if the thread has already covered this.) I believe I understand 
the WHAT in this situation, but I don't understand the WHY ...
Given this class definition:

  class Cls(object):
      x = 345

... I observe the following, using IDLE 2.6.1:

inst = Cls()
Cls.x is inst.x
True

Cls.x += 1
Cls.x is inst.x
True

inst.x += 1
Cls.x is inst.x
False

My question is ... WHY does the interpreter silently create the instance attribute at 
this point, causing a "surprising decoupling" from the class attribute? WHY 
doesn't the interpreter behave as it would with a simple, non-instance variable:

  > python
  Python 2.6.1 ...
  Type "help", "copyright", "credits" or "license" for more information.

  >>> x += 1
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  NameError: name 'x' is not defined

Is there a beneficial effect of silently creating the instance attribute, which outweighs 
the detrimental effects: (1) inconsistency, (2) the "surprising" decoupling?
I wouldn't call it "silently" because "inst.x = ..." is quite explicit 
about "x" being an attribute of "inst".  The rules for creating a 
variable are simple and very consistent.
Each of
 Cls.x = ...
 inst.x = ...
 x = ...
will create a variable (if it does not already exist) in a class, instance or local name space respectively. Retrieving a value is more complex as Python may look through several namespaces in succession to find a value: (For example, inst.x will check the instance , then the class ...)
The problem here is that
 inst.x += 1
is really
 inst.x = inst.x+1
which according to those rules, (if inst.x is not yet defined)
has both an instance and a class reference in the same statement.

After that, x.inst is defined in the instance, so both sides refer to that.



Gary Herron




Tx,
John


--
http://mail.python.org/mailman/listinfo/python-list
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to