Sono interessato a utilizzare l'oggetto elenco python, ma con funzionalità leggermente alterata. In particolare, vorrei che l'elenco fosse 1-index anziché 0-indexed. Es .:Come ereditare ed estendere un oggetto lista in Python?
>> mylist = MyList()
>> mylist.extend([1,2,3,4,5])
>> print mylist[1]
uscita dovrebbe essere: 1
Ma quando ho cambiato le __getitem__()
e __setitem__()
metodi per fare questo, mi è stato sempre un errore di RuntimeError: maximum recursion depth exceeded
. Ho armeggiato in giro con questi metodi molto, ma questo è fondamentalmente quello che avevo in là:
class MyList(list):
def __getitem__(self, key):
return self[key-1]
def __setitem__(self, key, item):
self[key-1] = item
Credo che il problema è che è essa stessa self[key-1]
chiamando lo stesso metodo è definire. In tal caso, come faccio a utilizzare il metodo list()
anziché il metodo MyList()
? Ho provato a utilizzare super[key-1]
invece di self[key-1]
ma che ha provocato la denuncia TypeError: 'type' object is unsubscriptable
Qualche idea? Anche se potresti indicarmi un buon tutorial per questo sarebbe fantastico!
Grazie!
Questo viola il Principio di sostituzione di Liskov in modo piuttosto evidente. Potrebbe non esserci molto valore nella sottoclasse di 'list' se non si può effettivamente usarlo da nessuna parte che ci si aspetterebbe un' elenco'. Forse la composizione sarebbe una strategia più appropriata in questo caso? – Ken
Non capisco bene; cosa intendi per "composizione"? Inoltre, come possiamo essere sicuri di non poter sostituire MyList al posto di una lista standard? C'è un buon modo per dire? Ad esempio, se i metodi interni usano '__getitem__' e' __setitem__', allora ci sarebbe un problema? – mindthief
mindthief: http://en.wikipedia.org/wiki/Composition_over_inheritance - e se cambi l'interfaccia esistente di 'list' (cioè, esattamente quello che stai chiedendo qui), allora non puoi sostituire un' MyList' per un 'elenco'. Anche le cose basilari come 'x [0]' non funzioneranno. – Ken