2012-10-26 7 views
12

Qualcuno potrebbe spiegare se è sicuro per reinizializzare un oggetto chiamando "auto. init ("., Come mostrato nel seguente esempio semplificato?reinizializzare un oggetto con self .__ init __ (...)

Il La ragione che sto chiedendo è che non sono riuscito a trovare questo metodo né in diversi libri di Python né in Internet.Vi sono alcuni che suggeriscono di elencare tutti gli attributi e impostarli al valore iniziale uno per uno. Fondamentalmente voglio impostare il mio oggetto su stato iniziale dopo aver terminato alcune attività

class Book(object): 
    def __init__(self,name,author): 
     self.name = name 
     self.author = author 
     self.copies = 5 

    def reset(self): 
     self.__init__(self.name,self.author) 

    def incrementCopy(self): 
     self.copies += 1 

Kite = Book('kite runner','khaled hosseini') 

print 'initial number of copies:', Kite.copies 
Kite.incrementCopy() 
Kite.incrementCopy() 
Kite.incrementCopy() 
print '3 copies are added:', Kite.copies 
Kite.reset() 
print 'number of copies are reinitialized', Kite.copies 


initial number of copies: 5 
3 copies are added: 8 
number of copies are reinitialized 5 
+1

Perché non è possibile farlo nella funzione 'reset' stessa, dopo aver passato di nuovo i valori iniziali? 'self.name' e' self.author' accedono al valore corrente, non a quello iniziale. –

+0

self.name e self.author non verranno modificati, in questo esempio possono essere ignorati. La mia domanda riguarda self .__ init__ part. Non ho capito bene la tua domanda. Che cosa vuoi dire con questo"? –

risposta

14

Lo considererei una pessima pratica - non dovresti t __init__ manualmente (a meno che non si chiami lo __init__ della classe genitore). Inoltre, il passaggio dei dati dell'oggetto a __init__ è un po 'strano.

Perché non qualcosa di simile:

class Book(object): 
    def __init__(self,name,author): 
     self.name = name 
     self.author = author 
     self.reset() 

    def reset(self): 
     self.copies = 5 
+3

+1. La soluzione standard (non solo in Python, ma nella maggior parte dei linguaggi con costruttori) consiste nel calcolare il codice necessario sia dal costruttore che dalle funzioni regolari. – abarnert

+0

Unico problema con questo sono gli avvertimenti del lint del codice: "Copie degli attributi di istanza definite al di fuori di __init__" – Greg

+0

sì, il modo consigliato sembra essere quello di creare tutti gli attributi in '__init__', francamente preferisco ignorarlo ed evitare la duplicazione. –

19

L'unica cosa speciale __init__ è che viene chiamato automaticamente quando viene creata un'istanza. Oltre a questo è un metodo normale, ed è sicuro utilizzarlo per riportare il tuo oggetto allo stato iniziale.

Detto questo, solo perché è sicuro non significa che sia una buona idea. Altre persone che guardano il tuo codice potrebbero essere confuse da esso, e non è difficile fare tutto in un metodo reset (che __init__ può anche chiamare) per essere più espliciti su come il metodo viene utilizzato.

Problemi correlati