创建列表的子类而不使用深度复制

2024-04-25 03:48:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想给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)

Tags: 对象方法函数selfl1列表my子类
1条回答
网友
1楼 · 发布于 2024-04-25 03:48:59

很确定这在list子类中是不可能的。对于^{}子类(在Python 2中仅为^{}),它是可能的:

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公开了一个^{}属性,该属性包含实际的list实例,这使得我们可以很容易地用iterable it替换它,基本上只需将提供的参数放在那里并保留引用:

通过初始化:

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

当然,引用datal1属性发生了变异:

print(l1, l2, sep='\n')
[0, 1, 2, -5, 4, 5, 6, 7, 8, 9]
[0, 1, 2, -5, 4, 5, 6, 7, 8, 9]

相关问题 更多 >