Python 3.4.0a1
Windows 8.1
Class Created:
class Bank(object):
bankrupt = False
Command entered in IDLE __main__
You assigned to a new attribute to the instance instead. To change a class attribute, assign directly to the class.
When looking up an attribute on an instance, look-up 'falls through' to the class, then to the base classes. This is how all class attributes, including methods, are found.
But when assigning, this happens directly on the instance. Otherwise you could never assign per-instance values, you'd only ever assign back to the class. Assigning to a.bankrupt
or b.bankrupt
will add an attribute to the instance, if it wasn't already there to begin with. To Python, there is no difference between using self.bankrupt = True
in a method, or to using a.bankrupt = True
from the 'outside' to assign to an attribute.
Just assign to the class attribute directly (from a method or from 'outside'):
Bank.bankrupt = True
Note that the same fall-through on read, assignment on write rules apply to base classes; looking up an attribute on a class looks to the base classes if the attribute is not found on the class directly, but setting an attribute on a class do so directly, and not affect attributes on the bases.
For the nitty gritty details, see the Custom classes and Class instances sections of the Python datamodel.