2013-01-23 19 views
6

Cosa c'è di sbagliato con questo codice?Tipi interni Python sottoclassi

class MyList(list): 
    def __init__(self, li): self = li 

Quando creo un'istanza di MyList con, per esempio, MyList([1, 2, 3]), e poi a stampare questo caso, tutto quello che ottiene è una lista vuota []. Se MyDict è una sottoclasse list, non è MyDict a list stesso?

NB: entrambi in Python 2.xe 3.x.

risposta

15

è necessario chiamare la lista di inizializzazione:

class MyList(list): 
    def __init__(self, li): 
     super(MyList, self).__init__(li) 

Assegnazione al self nella funzione solo sostituisce la variabile locale con l'elenco, non assegna nulla al caso:

>>> class MyList(list): 
...  def __init__(self, li): 
...   super(MyList, self).__init__(li) 
... 
>>> ml = MyList([1, 2, 3]) 
>>> ml 
[1, 2, 3] 
>>> len(ml) 
3 
>>> type(ml) 
<class '__main__.MyList'> 
+0

Sarebbe 'list .__ init __ (self)' funziona anche quando si eredita da 'list'? – Wolf

+0

@ Wolf: sì, ma ciò preclude l'ereditarietà multipla, ad es. usando questa classe come base insieme ad un'altra classe. 'list' potrebbe non essere la prossima classe nell'MRO in questi casi. –

+0

Grazie per averci segnalato! La risposta breve che ho già trovato qui: [* Sottoclassi tipi incorporati *] (http://www.cafepy.com/article/python_attributes_and_methods/ch03s02.html). * MRO * Spero di aver risolto correttamente l'ordine di risoluzione dei metodi *. – Wolf

0

ho pensato da solo: self è un'istanza di una sottoclasse di list, quindi non può essere trasmesso per elencare che è ancora un oggetto MyList.

+2

No, 'self' è un riferimento a un'istanza di' MyList'. Python non ha casting. Vedi la risposta di Martijn Pieter. – chepner

+0

@chepner Mentre tecnicamente vero, è molto comune anche per le persone che capiscono il nocciolo di come i nomi fanno riferimento/puntano agli oggetti e gli effetti per i tipi mutabili vs immutabili per esprimere una relazione come "x è una lista di tre numeri interi "anche x è stato assegnato come' a = 7 – cfwschmidt