Perché i costruttori sono effettivamente chiamati "costruttori"?
Il costruttore (denominato __new__) crea e restituisce una nuova istanza della classe. Quindi il C.__new__metodo di classe è il costruttore per la classe C.
Il C.__init__metodo dell'istanza viene chiamato su un'istanza specifica, dopo che è stata creata, per inizializzarla prima di essere ritrasmessa al chiamante. Quindi quel metodo è l' inizializzatore per nuove istanze di C.
In che modo sono diversi dai metodi in una classe?
Come affermato nella documentazione ufficiale, __init__ viene richiamato dopo la creazione dell'istanza . Altri metodi non ricevono questo trattamento.
Qual è il loro scopo?
Lo scopo del costruttore C.__new__è definire il comportamento personalizzato durante la costruzione di una nuova Cistanza.
Lo scopo dell'inizializzatore C.__init__è definire l'inizializzazione personalizzata di ogni istanza di Cdopo che è stata creata.
Ad esempio Python ti permette di fare:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Ma se vuoi che ogni istanza di Testabbia un attributo xuguale a 10, puoi inserire quel codice all'interno __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Ogni metodo di istanza (un metodo chiamato su un'istanza specifica di una classe) riceve l'istanza come primo argomento. Questo argomento è convenzionalmente denominato self.
I metodi di classe, come il costruttore __new__, ricevono invece la classe come primo argomento.
Ora, se desideri valori personalizzati per l' xattributo, tutto ciò che devi fare è passare quel valore come argomento a __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Spero che questo ti aiuti a chiarire alcuni dubbi e, poiché hai già ricevuto buone risposte alle altre domande, mi fermo qui :)
__init__è un inizializzatore . Il costruttore di python è__new__. Python utilizza l'inizializzazione automatica a due fasi -__new__restituisce un oggetto valido ma (di solito) non popolato (vediboolper un controesempio), che poi lo ha__init__richiamato automaticamente. Ciò evita i problemi che linguaggi come C ++ hanno con oggetti parzialmente costruiti - non ne hai mai uno in Python (sebbene possa essere parzialmente inizializzato). Non avrai quasi mai bisogno di sovrascrivere entrambi__new__e__init__su una classe.