2016-04-19 5 views
1

Üben Sie die Beispiele gepostet here zum Erlernen von Python OOP. Ich suche nach der Ausgabe von '1 bis 4', aber stattdessen wird der Fehler unten angezeigt.Python getslice Element Operator Override Funktion funktioniert nicht

class FakeList: 
    def __getslice___(self,start,end): 
     return str(start) + " to " + str(end) 

f = FakeList() 

f[1:4] 

Hinweis: Die Verwendung f.__getitem__(1, 4) Ergebnisse in der richtigen Ausgabe - "1 bis 4", wie in der obigen Verbindung gezeigt.

Traceback (most recent call last) in() ----> 1 f[1:4]

TypeError: 'FakeList' object is not subscriptable

+0

Was die Python-Version ist? – vaultah

+0

Verwenden von Version 3.5 –

+2

Verwenden Sie nicht '__getslice__', es wurde lange zurückgewiesen und in Python 3 entfernt. Verwenden Sie' __getitem__', es unterstützt Slice-Objekte. –

Antwort

1

Wie in den Kommentaren erwähnt, ist die __getitem__ Methode einen Parameter slice Typ nimmt, und Sie können Start/Ende des Bereichs über slice.start und slice.stop, geht es hier ist ein Beispiel mit etwas mehr Debug-Ausgabe, was zu zeigen ist los:

class FakeList: 

    def __getitem__(self, slice_): 
     print('slice_', slice_) 
     print('type(slice_)', type(slice_)) 
     print('dir(slice_)', dir(slice_)) 
     return str(slice_.start) + " to " + str(slice_.stop) 

f = FakeList() 

print(f[1:4]) 

die Ausgabe:

slice_ slice(1, 4, None) 

type(slice_) <class 'slice'> 

dir(slice_) ['__class__', '__delattr__', '__dir__', '__doc__', 
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', 
'__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', 
'__str__', '__subclasshook__', 'indices', 'start', 'step', 'stop'] 

1 to 4 
Verwandte Themen