创建列表的子类而不进行深层复制

时间:2016-09-27 17:05:41

标签: python list python-3.x oop inheritance

我希望将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)

1 个答案:

答案 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