我希望将list
子类化为其添加一些函数,例如my_func
。
有没有办法在不复制整个列表的情况下执行此操作,即创建一个浅层副本,创建MyList
对象,让MyList
引用与用于构造的列表相同的列表它?
class MyList(list):
def my_func(self):
# do some stuff
return self
l1 = list(range(10))
l2 = MyList(l1)
print(l1)
print(l2)
l1[3] = -5
print(l1)
print(l2)
答案 0 :(得分:4)
非常确定使用list
子类是不可能的。 可以使用 collections.UserList
子类(在Python 2
中只是 UserList
):
from collections import UserList
class MyList(UserList):
def __init__(self, it=None):
# keep reference only for list instances
if isinstance(it, list):
self.data = it
else:
super().__init__(it)
def my_func(self):
# do some stuff
return self
UserList
公开包含实际列表实例的data
属性的事实使我们可以很容易地用可迭代的it
替换它,并且基本上只删除提供的参数并且< em>保留引用:
通过初始化:
l1 = list(range(10))
l2 = MyList(l1)
print(l1, l2, sep='\n')
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后改变:
l1[3] = -5
引用data
的{{1}}属性当然是变异的:
l1