Python Language Valori predefiniti per variabili di istanza


Esempio

Se la variabile contiene un valore di un tipo immutabile (ad es. Una stringa), allora va bene assegnare un valore predefinito come questo

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

È necessario prestare attenzione durante l'inizializzazione di oggetti mutabili come gli elenchi nel costruttore. Considera il seguente esempio:

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

Questo comportamento è causato dal fatto che in Python i parametri predefiniti sono vincolati all'esecuzione della funzione e non alla dichiarazione di funzione. Per ottenere una variabile di istanza predefinita che non è condivisa tra le istanze, si dovrebbe usare un costrutto come questo:

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 

Vedi anche Argomenti predefiniti mutabili e "Almost Astonishment" e l'argomento Mutable Default .