2013-04-16 3 views
13

ich eine Klasse wie unten machen:Wie die Scheibe Funktionalität der Liste in seiner abgeleiteten Klasse außer Kraft zu setzen

class MyList(list): 
    def __init__(self, lst): 
     self.list = lst 

Ich möchte Scheibe Funktionalität in MyList

+0

prüfen dies: http://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem –

+0

http://stackoverflow.com/questions/ 1957780/python-overloading-the-operator-getitem-methode ... als ich zum Schließen gehen wollte, habe ich den falschen Grund falsch gewählt ... sollte als ein Duplikat von diesem sein. –

Antwort

27

Sie müssen außer Kraft gesetzt werden, um benutzerdefinierte __getitem__(), bieten __setitem__ und __delitem__ Haken.

Diese sind eine slice object beim Schneiden der Liste übergeben; diese haben start, stop und step Attribute (die None sein könnte):

def __getitem__(self, key): 
    if isinstance(key, slice): 
     return [self.list[i] for i in xrange(key.start, key.stop, key.step)] 
    return self.list[key] 

oder für Ihren Fall:

def __getitem__(self, key): 
    return self.list[key] 

weil ein list kann nehmen Sie die slice Objekt direkt.

In Python 2, list.__getslice__ wird für Slices ohne Schritt (also nur starten und stoppen Indizes), wenn implementiert, und der integrierte list Typ implementiert es so, dass Sie dies auch überschreiben müssen; eine einfache Übertragung auf Ihre __getitem__ Methode gut tun sollte:

def __getslice__(self, i, j): 
    return self.__getitem__(slice(i, j)) 
2
class MyList(list): 
    def __init__(self, lst): 
     self.list = lst 

macht nicht viel Sinn machen ... self ist die Liste Objekt selbst, und es hat zu diesem Zeitpunkt bereits erstellt worden ist, vielleicht möchten Sie zu überschreiben __new__, aber Sie müssen wahrscheinlich nicht berühren. Auf jeden Fall wollen Sie __getitem__ wie so außer Kraft zu setzen:

def __getitem__(self, val): 
    if isinstance(val, slice): 
     # do stuff here 
Verwandte Themen