python内置列表的_init__方法下面的初始化过程是什么
我的问题是list类的init方法是否会调用其他方法(如append或insert)来实现其功能 比如: 我想: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,都会调
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]