Python 切片将UserList转换为list
在实现自定义列表(通过Python 切片将UserList转换为list,python,collections,Python,Collections,在实现自定义列表(通过UserList)时,我注意到所有切片操作都返回一种list类型,而不是派生类类型。这会产生一个问题,即在切片之后,对象中没有任何添加的功能可用。这里有一个快速测试程序来演示这个问题,只需注意实际代码更复杂 #!/usr/bin/python3 from collections import UserList class myList(UserList): def __init__(self, data=None): super().__init_
UserList
)时,我注意到所有切片操作都返回一种list
类型,而不是派生类类型。这会产生一个问题,即在切片之后,对象中没有任何添加的功能可用。这里有一个快速测试程序来演示这个问题,只需注意实际代码更复杂
#!/usr/bin/python3
from collections import UserList
class myList(UserList):
def __init__(self, data=None):
super().__init__(data)
def setFunc(self, data):
self.data.extend(data)
def getFunc(self):
return self.data
l1 = myList()
l1.setFunc([1,2,3,4])
print(type(l1))
l2 = l1[:3]
print(type(l2))
print(l2.getFunc())
<class '__main__.myList'>
<class 'list'>
Traceback (most recent call last):
File "./test.py", line 17, in <module>
print(l2.getFunc())
AttributeError: 'list' object has no attribute 'getFunc'
#/usr/bin/python3
从集合导入用户列表
类myList(用户列表):
def uuu init uuuu(self,data=None):
super().\uuuu init\uuuu(数据)
def setFunc(自身,数据):
self.data.extend(数据)
def getFunc(自身):
返回self.data
l1=myList()
l1.setFunc([1,2,3,4])
打印(l1型)
l2=l1[:3]
打印(类型(l2))
打印(l2.getFunc())
回溯(最近一次呼叫最后一次):
文件“/test.py”,第17行,在
打印(l2.getFunc())
AttributeError:“list”对象没有属性“getFunc”
我可以通过使用l2=myList(l1[:3])
来“转换”列表来克服这个问题,但似乎正确的解决方案是直接在myList
中实现这个功能
我不确定这样做的正确/最优雅的方式。我怀疑在\uuuu getitem\uuuuu
中进行强制转换会起作用。这是最好的方法还是对切片有更直接的改变?另外,为了确保所有操作都返回myList
而不是list
,我还应该重写哪些其他方法?我不确定为什么这不是UserList
中的默认行为,但在派生类中实现以下操作似乎可以解决问题
def __getitem__(self, i):
new_data = self.data[i]
if type(new_data) == list:
return self.__class__(new_data)
else:
return new_data
的参数i
显然可以是切片
对象或整数,因此新数据
将是列表
或单个元素。如果它是一个列表
,请将其放入myList
容器中并返回。否则,如果它是单个元素,只需将其传递回去。它看起来像是在Python 3.8中被修复的,UserList([0,1,2,3])[0:2]。\uu class\uuu
现在返回UserList