Estoy interesado en usar el objeto de la lista de python, pero con una funcionalidad ligeramente alterada. En particular, me gustaría que la lista tenga 1 índice en lugar de 0 indexados. Ej .:¿Cómo heredar y extender un objeto de lista en Python?
>> mylist = MyList()
>> mylist.extend([1,2,3,4,5])
>> print mylist[1]
salida debe ser: 1
Pero cuando cambié los métodos __getitem__()
y __setitem__()
hacer esto, yo estaba recibiendo un error RuntimeError: maximum recursion depth exceeded
. Yo vanamente alrededor con estos métodos mucho, pero esto es básicamente lo que tenía allí:
class MyList(list):
def __getitem__(self, key):
return self[key-1]
def __setitem__(self, key, item):
self[key-1] = item
Supongo que el problema es que es en sí mismo self[key-1]
a llamar al mismo método que está definiendo. Si es así, ¿cómo hago que use el método list()
en lugar del método MyList()
? Intenté usar super[key-1]
en lugar de self[key-1]
pero eso resultó en la queja TypeError: 'type' object is unsubscriptable
¿Alguna idea? ¡También si pudieras señalarme un buen tutorial para esto sería genial!
Gracias!
Esto viola el Principio de Sustitución de Liskov bastante descaradamente. Puede que no haya mucho valor en la subclasificación de 'list' si no se puede usar en cualquier lugar donde se espere una' list'. Quizás la composición sería una estrategia más apropiada en este caso? – Ken
No entiendo del todo; ¿Qué quieres decir con "composición"? Además, ¿cómo podemos estar seguros de que no podemos sustituir MyList en lugar de una lista estándar? ¿Hay una buena manera de saberlo? Por ejemplo, si los métodos internos usan '__getitem__' y' __setitem__', ¿habría algún problema? – mindthief
mindthief: http://en.wikipedia.org/wiki/Composition_over_inheritance - y si cambia la interfaz existente de 'list' (es decir, exactamente lo que está pidiendo aquí), entonces no puede sustituir un' MyList' para una 'lista'. Incluso cosas básicas como 'x [0]' no funcionarán. – Ken