这个非常简单的代码段在python 2上失败,但在python 3上通过了:
class A:
def __init__(self, value):
self.value = value
def __setitem__(self, key, value):
pass
r = A(1)
r[80:-10] = list(range(10))
在python2上,解释器调用不存在的__len__
并因此失败:
Traceback (most recent call last):
File "prog.py", line 9, in <module>
AttributeError: A instance has no attribute '__len__'
此行为记录在哪里?强制容器具有一定大小没有意义。
答案 0 :(得分:6)
这是一个老式的类古怪。旧式类有很多文献记载不充分的怪癖,其中大多数是旧行为,无法跟上对Python的更改。
这里,types.InstanceType
has a __setslice__
,它负责查找旧式类__setitem__
和__setslice__
。由于此__setslice__
存在,Python会尝试通过__setslice__
,这需要首先对负片索引进行len
调用。您的(老式)类没有__len__
,因此调用失败。
使用新型的类:
class A(object):
...
答案 1 :(得分:0)
原因是您使用的是旧式类。在python 2中,新型类(这是python 3中唯一的类)的语法为
class T(object):
...