【发布时间】:2018-12-20 10:09:18
【问题描述】:
我正在使用 Python 2.7,我正在尝试从继承 list 的类中重载 __getitem__ 和 __setitem__。
假设我有这门课A:
class A(list):
def __getitem__(self, key):
print "GET!"
def __setitem__(self, key, value):
print "SET!"
应使用方括号调用A.__getitem__ 或A.__setitem__。通常是这样,但是当我使用[:] 时,会调用父实现。为什么?为什么[::] 有效?
a = A([1])
a[1] # prints GET!
a["1"] # prints GET!
a[::] # prints GET!
a[slice(None)] # prints GET!
a[:] # returns the list [1]
__setitem__ 也一样:
a[1] = 2 # prints SET!
a[::] = 2 # prints SET!
a[slice(None)] = 2 # prints SET!
a[:] = [2] # changes the list
【问题讨论】:
标签: python python-2.7 list slice python-internals