代码是:
class MyClass:
...
def __getitem__(self, index):
...
def __setitem__(self, index, value):
...
def __delitem__(self, index):
...
if sys.version_info < (2, 0):
# They won't be defined if version is at least 2.0 final
def __getslice__(self, i, j):
return self[max(0, i):max(0, j):]
def __setslice__(self, i, j, seq):
self[max(0, i):max(0, j):] = seq
def __delslice__(self, i, j):
del self[max(0, i):max(0, j):]
我只是没有得到__getslice__(self,i,j)
,__setslice__(self,i,j,seq)
和__delslice__(self,i,j)
返回的内容。
他们在这里退回一份清单吗?如果没有,请向我解释一下?
答案 0 :(得分:0)
顺便说一句, __getslice__
已弃用,但仍使用http://bugs.python.org/issue2041
您粘贴的代码仅为Python解释器的非常旧版本定义了这些函数。
无论如何,如果你想实现这些功能,请遵循任何内置类型,例如: list
确实:
__setslice__
不会返回任何内容,但会替换内容为(i, j)
的自己的范围seq
In [3]: l = list()
In [4]: l.__setslice__(1, 3, [1,2,3])
In [5]: l
Out[5]: [1, 2, 3]
__delslice__
不会返回任何内容,删除自己的范围(i, j)
__getslice__
会返回范围(i, j)
In [10]: l = range(5)
In [11]: l.__getslice__(1,3)
Out[11]: [1, 2]
In [12]: l[1:2]
Out[12]: [1]
In [13]: l[1:2+1]
Out[13]: [1, 2]
当然,您可以自由地实现这些方法来做任何您喜欢的事情并返回您喜欢的任何内容,但最好还是保持预期的语义。
最后,Python有一个 slice
内置,它是索引i, j, step
的容器,例如:
In [18]: l[s]
Out[18]: [1, 3]
In [19]: l = range(100)
In [20]: s = slice(1, 10, 2)
In [21]: l[s]
Out[21]: [1, 3, 5, 7, 9]
In [22]: l[1:10:2]
Out[22]: [1, 3, 5, 7, 9]
答案 1 :(得分:0)
与大多数python的钩子方法一样,__getslice__
可以返回你想要的任何东西。 __setslice__
和__delslice__
不应返回任何内容。
请注意,这些方法的用法是deprecated - 你实际上不需要使用它们除非你实际上是继承了仍然实现该方法的python内置的(或者另一个用户定义的类,它实现了我想的那些方法。
答案 2 :(得分:0)
在2.0之前的Python版本中,切片与索引分开处理。 seq[i]
会调用seq.__getitem__(i)
,而seq[i:j]
会调用seq.__getslice__(i,j)
。但是,从2.0开始,__getitem__
通过接收单个切片对象作为其参数来处理这两种情况,即seq[i:j]
调用seq.__getitem__(slice(i,j))
。它们基本上是不必要的,除非您在使用CPython实现继承内置类型时需要覆盖它们。
在您的代码中,__getslice__
会返回__getitem__
次返回的内容,而__setslice__
和__delslice__
都会返回None
。
答案 3 :(得分:0)
__getslice__
是yourobj [a:b:c]的实现,虽然它已被弃用,但你仍然可以实现它。 {@ 1}}和__setslice__
也已弃用,并且是__delslice__
的设置者和删除者。
该方法返回什么?请参阅您的代码:__getslice__
仅实现了python&lt; 2.0(即仅当他们的实施需要不被弃用时)。
__getslice__
返回self [max(i,0),max(j,0)],它将在python&lt;中再次调用__getslice__
2.0。我认为它会给你一个Stack Overflow(你在__getslice__
上调用它,然后再调用相同的方法)。
让我们看看(python&lt; 2.0):
self
( - 4,2)将返回self [0,2],它将在__getslice__
(0,2)中转换,这将返回self [0,2],这将成为一个以无限的方式调用__getslice__
(0,2),或直到你的内存堆爆炸为止。