为什么旧/新式python类在切片传递给__getitem__的方式上有所不同

时间:2017-08-03 23:16:32

标签: python python-2.7

调试一些东西我发现了这个区别:

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是一个有趣的例外)。

但我很好奇,为什么?什么样的实现细节会导致这种情况。

1 个答案:

答案 0 :(得分:3)

您正在寻找的实现细节是type旧式实例 - 不是旧式类,而是类型 - 实现__getslice____getslice__是实现切片的旧方法,使用__getslice__时,在调用sys.maxsize之前,未提供的左右切片端点分别转换为0和__getslice__

类型__getslice__然后在类中查找__getslice__方法,找不到,并使用您的__getitem__方法,构建并传递切片,但{ {1}}转换已经发生。

您可以在Objects/classobject.c中看到sys.maxsize实施为__getslice__。请注意,C函数将两个instance_slice整数作为切片端点,并且没有任何未提供端点的概念。