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