diff options
author | Raymond Hettinger <python@rcn.com> | 2014-06-23 18:08:01 -0700 |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2014-06-23 18:08:01 -0700 |
commit | 04ba0bb80c6f2b336a031cb0f4ced3fc8297f601 (patch) | |
tree | 29ccfa376ead057edf33fc1a802b09134ac08bde | |
parent | c0f964fd55b0c5dbc8af895394258784735f1189 (diff) | |
download | cpython-git-04ba0bb80c6f2b336a031cb0f4ced3fc8297f601.tar.gz |
Issue #11974: Add tutorial section on class and instance variables
(Based on a patch from Renee Chu.)
-rw-r--r-- | Doc/tutorial/classes.rst | 71 | ||||
-rw-r--r-- | Misc/ACKS | 1 |
2 files changed, 72 insertions, 0 deletions
diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 08072a31a1..6c71d80e03 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -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 @@ -238,6 +238,7 @@ Matt Chisholm Lita Cho Anders Chrigström Tom Christiansen +Renee Chu Vadim Chugunov Mauro Cicognini David Cinege |