调试一些东西我发现了这个区别:
class A:
def __getitem__(self, x):
print x
class B(object):
def __getitem__(self, x):
print x
a = A()
b = B()
然后
>>> a[2:]
slice(2, 9223372036854775807, None)
>>> b[2:]
slice(2, None, None)
>>> a[:2]
slice(0, 2, None)
>>> b[:2]
slice(None, 2, None)
我基本上已经知道旧样式类将为slice的start和stop参数提供数字(0 / INT_MAX)(尽管step是一个有趣的例外)。
但我很好奇,为什么?什么样的实现细节会导致这种情况。
答案 0 :(得分:3)
您正在寻找的实现细节是type
旧式实例 - 不是旧式类,而是类型 - 实现__getslice__
。 __getslice__
是实现切片的旧方法,使用__getslice__
时,在调用sys.maxsize
之前,未提供的左右切片端点分别转换为0和__getslice__
类型__getslice__
然后在类中查找__getslice__
方法,找不到,并使用您的__getitem__
方法,构建并传递切片,但{ {1}}转换已经发生。
您可以在Objects/classobject.c
中看到sys.maxsize
实施为__getslice__
。请注意,C函数将两个instance_slice
整数作为切片端点,并且没有任何未提供端点的概念。