Issue #11974: Add tutorial section on class and instance variables
(Based on a patch from Renee Chu.)
This commit is contained in:
parent
c0f964fd55
commit
04ba0bb80c
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue