-
汪汪一只猫
切片对象时,该__getitem__()方法将接收一个slice对象。简单地看start,stop和step对成员的slice对象,以获得该片段的组件。>>> class C(object):... def __getitem__(self, val):... print val... >>> c = C()>>> c[3]3>>> c[3:4]slice(3, 4, None)>>> c[3:4:-2]slice(3, 4, -2)>>> c[():1j:'a']slice((), 1j, 'a')
-
蓝山帝景
我有一个“合成”列表(数据大于您要在内存中创建的列表),我的__getitem__样子是这样的:def __getitem__( self, key ) : if isinstance( key, slice ) : #Get the start, stop, and step from the slice return [self[ii] for ii in xrange(*key.indices(len(self)))] elif isinstance( key, int ) : if key < 0 : #Handle negative indices key += len( self ) if key < 0 or key >= len( self ) : raise IndexError, "The index (%d) is out of range."%key return self.getData(key) #Get the data from elsewhere else: raise TypeError, "Invalid argument type."切片不会返回相同的类型,这是不可以的,但是对我有用。
-
慕的地10843
如何定义getitem类以处理纯索引和切片?切片对象当您使用的下标符号冒号被自动创建的-而这正是传递给__getitem__。使用isinstance来检查,如果你有一个切片对象:from __future__ import print_functionclass Sliceable(object): def __getitem__(self, subscript): if isinstance(subscript, slice): # do your handling for a slice object: print(subscript.start, subscript.stop, subscript.step) else: # Do your handling for a plain index print(subscript)假设我们使用的是范围对象,但我们希望切片返回列表,而不是新的范围对象(确实如此):>>> range(1,100, 4)[::-1]range(97, -3, -4)由于内部限制,我们不能对范围进行子类化,但是我们可以委托给它:class Range: """like builtin range, but when sliced gives a list""" __slots__ = "_range" def __init__(self, *args): self._range = range(*args) # takes no keyword arguments. def __getattr__(self, name): return getattr(self._range, name) def __getitem__(self, subscript): result = self._range.__getitem__(subscript) if isinstance(subscript, slice): return list(result) else: return resultr = Range(100)我们没有完美可替换的Range对象,但它非常接近:>>> r[1:3][1, 2]>>> r[1]1>>> 2 in rTrue>>> r.count(3)1为了更好地理解切片符号,这是Sliceable的示例用法:>>> sliceme = Sliceable()>>> sliceme[1]1>>> sliceme[2]2>>> sliceme[:]None None None>>> sliceme[1:]1 None None>>> sliceme[1:2]1 2 None>>> sliceme[1:2:3]1 2 3>>> sliceme[:2:3]None 2 3>>> sliceme[::3]None None 3>>> sliceme[::]None None None>>> sliceme[:]None None NonePython 2,请注意:在Python 2中,有一个不赞成使用的方法,在子类化某些内置类型时可能需要重写该方法。从数据模型文档中:object.__getslice__(self, i, j)从2.0版开始不推荐使用:支持将切片对象用作__getitem__()方法的参数。(但是,CPython中的内置类型当前仍在实现__getslice__()。因此,在实现切片时必须在派生类中重写它。)这在Python 3中已经消失了。