2011-12-04 16 views
5

ho due costruttori nella mia classe:Constructor concatenamento in python

def __init__(self): 
    self(8) 

def __init__(self, size): 
    self.buffer = [1] * size 

dove voglio il primo costruttore a chiamare la seconda con una dimensione predefinita. È realizzabile in python?

+3

Non hai due costruttori, il secondo sovrascrive il primo. – u0b34a0f6ae

risposta

9

Non è possibile definire più inizializzatori in Python (come evidenziato nei commenti, __init__is not really a constructor), ma è possibile definire i valori di default, per esempio:

def __init__(self, size=8): 
    self.buffer = [1] * size 

Nel codice di cui sopra, un buffer di dimensioni 8 è creato per impostazione predefinita, ma se viene specificato un parametro dimensione, verrà utilizzato il parametro.

Ad esempio, supponiamo che l'inizializzatore si trovi in ​​una classe denominata Example. Questa chiamata creerà una nuova istanza della classe con un tampone di formato 8 (default):

e = Example() 

considerando questa chiamata creerà una nuova istanza di un buffer di dimensione 10:

e = Example(10) 

In alternativa, è possibile chiamare il costruttore in questo modo:

e = Example(size=10) 
+1

'__init__' non è un costruttore, ma piuttosto un inizializzatore. Vedi ['__init__' come costruttore?] (Http://stackoverflow.com/questions/6578487/init-as-a-constructor). – Nathan

+0

Grazie per avermelo fatto notare, @Nathan. Ho modificato la mia risposta di conseguenza. –

5

No, non è possibile sovraccaricare i metodi in Python. In questo caso, si potrebbe utilizzare un valore predefinito per il parametro size invece:

def __init__(self, size=8): 
    self.buffer = [1] * size 
1

probabilmente non in questo modo. Le classi Python usano un dizionario interno per memorizzare il suo metodo e le sue proprietà, un secondo metodo con lo stesso nome sovrascrive il primo. Si potrebbe assegnare un valore predefinito al tuo parametro in più per fare questo,

def __init__(self, size = 8): 
    self.buffer = [1] * size