Issue #11974: Add tutorial section on class and instance variables

(Based on a patch from Renee Chu.)
This commit is contained in:
Raymond Hettinger 2014-06-23 18:08:01 -07:00
parent c0f964fd55
commit 04ba0bb80c
2 changed files with 72 additions and 0 deletions

View File

@ -387,6 +387,77 @@ object and the argument list, and the function object is called with this new
argument list.
.. _tut-class-and-instance-variables:
Class and Instance Variables
----------------------------
Generally speaking, instance variables are for data unique to each instance
and class variables are for attributes and methods shared by all instances
of the class::
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # shared by all dogs
'canine'
>>> e.kind # shared by all dogs
'canine'
>>> d.name # unique to d
'Fido'
>>> e.name # unique to e
'Buddy'
As discussed in :ref:`tut-object`, shared data can have possibly surprising
effects with involving :term:`mutable` objects such as lists and dictionaries.
For example, the *tricks* list in the following code should not be used as a
class variable because just a single list would be shared by all *Dog*
instances::
class Dog:
tricks = [] # mistaken use of a class variable
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks # unexpectedly shared by all dogs
['roll over', 'play dead']
Correct design of the class should use an instance variable instead::
class Dog:
def __init__(self, name):
self.name = name
self.tricks = [] # creates a new empty list for each dog
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
.. _tut-remarks:
Random Remarks

View File

@ -238,6 +238,7 @@ Matt Chisholm
Lita Cho
Anders Chrigström
Tom Christiansen
Renee Chu
Vadim Chugunov
Mauro Cicognini
David Cinege