Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python内置列表的_init__方法下面的初始化过程是什么_Python_List_Initialization_Subclass - Fatal编程技术网

python内置列表的_init__方法下面的初始化过程是什么

python内置列表的_init__方法下面的初始化过程是什么,python,list,initialization,subclass,Python,List,Initialization,Subclass,我的问题是list类的init方法是否会调用其他方法(如append或insert)来实现其功能 比如: 我想: x = test([1,2,3]) x [2,3,4] 但我得到了: [1,2,3] 我知道我可以通过重载init本身使它工作 def __init__(self,values): super().__init__([x+1 for x in values]) 我可以重载一些基本的值插入方法,比如setitem,这样所有的插入操作,比如append,insert,都会调

我的问题是list类的init方法是否会调用其他方法(如append或insert)来实现其功能

比如:

我想:

x = test([1,2,3])
x
[2,3,4]
但我得到了:

[1,2,3]
我知道我可以通过重载init本身使它工作

def __init__(self,values):
    super().__init__([x+1 for x in values])
我可以重载一些基本的值插入方法,比如setitem,这样所有的插入操作,比如append,insert,都会调用它,从而产生这种加法效果


感谢您的建议。

列表。\uuuu init\uuuu
不调用任何可重写的方法。它对实现
extend
方法的C函数进行了修改:

if (arg != NULL) {
    PyObject *rv = listextend(self, arg);
    if (rv == NULL)
        return -1;
    Py_DECREF(rv);
}

这是C语言中实现的大多数Python类型的大多数方法的情况。

我看到了另一个覆盖form
collections.MutableSequence的示例,它可以让您获得此功能。我不确定这是否比您最初的想法更方便,但它会在
\uuuu init\uuuu
追加
插入
扩展期间增加任何数字

class IncList(collections.MutableSequence):
    def __init__(self, int_list):
        self._list = []
        for el in int_list:
            self.append(el)

    def __len__(self): return len(self._list)
    def __getitem__(self, item): return self._list[item]
    def __delitem__(self, item): del self._list[item]

    def __setitem__(self, index, value):
        self._list[index] = value + 1

    def insert(self, index, value):
        self._list.insert(index, value + 1)

    def __str__(self):
        return str(self._list)

    def __repr__(self):
        return "%s(%r)" % (self.__class__, self._list)


> l = IncList([1, 2, 3])
> print(l)
[2, 3, 4]
> l.append(4)
> print(l)
[2, 3, 4, 5]
> l[0] = 0
> print(l)
[1, 3, 4, 5]
> l.extend([5, 6])
> print(l)
[1, 3, 4, 5, 6, 7]
> l.insert(1, 1)
> print(l)
[1, 2, 3, 4, 5, 6, 7]

有关更多信息,请参阅。

因此,我必须重载所有元素插入方法才能实现添加功能?包括追加、插入和扩展?这是个令人悲伤的消息。无论如何,谢谢你。@Jians:我发现这比通常的情况要好,你不知道什么重写会影响或干扰其他方法。人们没有充分考虑或记录他们提供给子类的API。对于那些日常工作不是编程的人来说,找到准确的文档确实是一项艰巨的工作。这就是为什么stackoverflow是向经验丰富的专家学习的最佳场所。这就是我一直在寻找的方式!MutableSequence和内置列表有什么区别?它们本质上是一样的吗?我不是专家,但这是我的理解。MutableSequence是一个从Sequence继承的抽象基类,它实现了与list相同的所有方法。非常感谢!这确实有帮助。@Jian的一个警告是,当调用
l.reverse()
时,此实现将增加移动的项。排序似乎不是一个问题。明白了,排序并不是真正的问题
class IncList(collections.MutableSequence):
    def __init__(self, int_list):
        self._list = []
        for el in int_list:
            self.append(el)

    def __len__(self): return len(self._list)
    def __getitem__(self, item): return self._list[item]
    def __delitem__(self, item): del self._list[item]

    def __setitem__(self, index, value):
        self._list[index] = value + 1

    def insert(self, index, value):
        self._list.insert(index, value + 1)

    def __str__(self):
        return str(self._list)

    def __repr__(self):
        return "%s(%r)" % (self.__class__, self._list)


> l = IncList([1, 2, 3])
> print(l)
[2, 3, 4]
> l.append(4)
> print(l)
[2, 3, 4, 5]
> l[0] = 0
> print(l)
[1, 3, 4, 5]
> l.extend([5, 6])
> print(l)
[1, 3, 4, 5, 6, 7]
> l.insert(1, 1)
> print(l)
[1, 2, 3, 4, 5, 6, 7]