-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
test_class_and_instance_variables.py
86 lines (60 loc) · 2.8 KB
/
test_class_and_instance_variables.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""Class and Instance Variables.
@see: https://docs.python.org/3/tutorial/classes.html#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.
"""
def test_class_and_instance_variables():
"""Class and Instance Variables."""
# pylint: disable=too-few-public-methods
class Dog:
"""Dog class example"""
kind = 'canine' # Class variable shared by all instances.
def __init__(self, name):
self.name = name # Instance variable unique to each instance.
fido = Dog('Fido')
buddy = Dog('Buddy')
# Shared by all dogs.
assert fido.kind == 'canine'
assert buddy.kind == 'canine'
# Unique to fido.
assert fido.name == 'Fido'
# Unique to buddy.
assert buddy.name == 'Buddy'
# Shared data can have possibly surprising effects with involving 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.
# pylint: disable=too-few-public-methods
class DogWithSharedTricks:
"""Dog class example with wrong shared variable usage"""
tricks = [] # Mistaken use of a class variable (see below) for mutable objects.
def __init__(self, name):
self.name = name # Instance variable unique to each instance.
def add_trick(self, trick):
"""Add trick to the dog
This function illustrate mistaken use of mutable class variable tricks (see below).
"""
self.tricks.append(trick)
fido = DogWithSharedTricks('Fido')
buddy = DogWithSharedTricks('Buddy')
fido.add_trick('roll over')
buddy.add_trick('play dead')
assert fido.tricks == ['roll over', 'play dead'] # unexpectedly shared by all dogs
assert buddy.tricks == ['roll over', 'play dead'] # unexpectedly shared by all dogs
# Correct design of the class should use an instance variable instead:
# pylint: disable=too-few-public-methods
class DogWithTricks:
"""Dog class example"""
def __init__(self, name):
self.name = name # Instance variable unique to each instance.
self.tricks = [] # creates a new empty list for each dog
def add_trick(self, trick):
"""Add trick to the dog
This function illustrate a correct use of mutable class variable tricks (see below).
"""
self.tricks.append(trick)
fido = DogWithTricks('Fido')
buddy = DogWithTricks('Buddy')
fido.add_trick('roll over')
buddy.add_trick('play dead')
assert fido.tricks == ['roll over']
assert buddy.tricks == ['play dead']