2011-09-08 6 views
5

Ho deciso di usare str per la stampa il contenuto di un albero in struttura ad albero, utilizzando qualcosa di similePerché str non può ottenere un secondo parametro, quando __str__ può?

print tree 

I nodi dell'albero sono tutti gli oggetti di classi create dall'utente e sovraccaricare il loro __str__ metodo magico al fine di utilizzare str il bambino nodi dopo schede t rientro del genere

def __str__ (self,t=0) :` 
    return t*'\t' + str(self.label) +':' +'\n'+ str(self.l,t+1)+'\n'+str(self.right,t+1)+'\n' 

Tuttavia non posso chiamare str con tale parametro t, ma posso chiamare node.__ str__(t=4) .Isn't str, scorciatoia solo per la magia metodo? O è perché il pa rser rifiuta parametri aggiuntivi a str senza controllare il metodo magico?

P.S. Sono interessato al comportamento. So che non è il modo migliore per stampare un albero, è stato un trucco;)

risposta

7

Immagina in questo modo.

def str(obj): 
    try: 
     return obj.__str__() 
    except ...: 
     ... 

Solo perché __str__ può prendere più parametri, non significa che str è configurato per passare attraverso quei parametri.

+0

ma se str si comporta come nel tuo esempio, funzionerà se obj .__ str __() non porta all'eccezione. E non nel mio caso. –

+0

ho capito, mi dispiace;) –

+0

@Alexander Ivanov: Il '...' nel codice è * codice omesso *, solo a scopo illustrativo. Non intendevo dare un'implementazione completa di 'str'. –

1

Se si dispone di una classe C con un methode __str__(self, t=0), str(c) chiamerà C.__str__(c) che imposta t a zero come dichiarato. str() accetta solo un argomento.

Problemi correlati