Python Language Valeurs par défaut pour les variables d'instance


Exemple

Si la variable contient une valeur d'un type immuable (par exemple une chaîne), il est possible d'attribuer une valeur par défaut comme celle-ci

class Rectangle(object):
    def __init__(self, width, height, color='blue'):
        self.width = width
        self.height = height
        self.color = color
    
    def area(self):
        return self.width  * self.height 

# Create some instances of the class
default_rectangle = Rectangle(2, 3)
print(default_rectangle.color) # blue

red_rectangle = Rectangle(2, 3, 'red')
print(red_rectangle.color) # red

Il faut faire attention lors de l'initialisation d'objets mutables tels que les listes dans le constructeur. Prenons l'exemple suivant:

class Rectangle2D(object):
    def __init__(self, width, height, pos=[0,0], color='blue'):  
        self.width = width
        self.height = height
        self.pos = pos
        self.color = color

r1 = Rectangle2D(5,3)
r2 = Rectangle2D(7,8)
r1.pos[0] = 4
r1.pos # [4, 0]
r2.pos # [4, 0] r2's pos has changed as well

Ce comportement est dû au fait que dans Python, les paramètres par défaut sont liés à l'exécution de la fonction et non à la déclaration de la fonction. Pour obtenir une variable d’instance par défaut qui n’est pas partagée entre les instances, il faut utiliser une construction comme celle-ci:

class Rectangle2D(object):
    def __init__(self, width, height, pos=None, color='blue'):  
        self.width = width
        self.height = height
        self.pos = pos or [0, 0] # default value is [0, 0]
        self.color = color

r1 = Rectangle2D(5,3)
r2 = Rectangle2D(7,8)
r1.pos[0] = 4
r1.pos # [4, 0]
r2.pos # [0, 0] r2's pos hasn't changed 

Voir également les arguments de Mutable par défaut et la «moindre surprise» et l'argument par défaut Mutable .