[英]in-place append while subclassing a list in Python
我想在 Python 中对list
对象进行子类化,并添加一个类似于append
方法的方法。 我在下面的例子中称之为append_
class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self = self.__class__(new_list)
return self
这是一个非常简单的例子,但这是我的问题:假设我用一些列表实例化一个对象my_list
,然后我尝试将一个额外的元素附加到my_list
my_list = MyList(list(range(5)))
my_list.append_(6) # returns [0,1,2,3,4,6]
# BUT
my_list # returns [0,1,2,3,4]
所以最后我什么都没附加。 我既不明白出了什么问题,也不明白在哪里可以找到解决这个问题的帮助......
我正在使用 Python 3.9.12,如果它有帮助的话......
由于您的append_()
函数在其名称末尾包含下划线,因此在调用它时不会将任何内容附加到列表对象。 因此,要获得正确的结果,您需要使用不带下划线的append()
:
class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self = self.__class__(new_list)
return self
my_list = MyList(list(range(5)))
print(my_list)
print(my_list.append(6))
print(my_list)
输出:
[0, 1, 2, 3, 4]
None
[0, 1, 2, 3, 4, 6]
相反,当您使用类中的函数运行代码时:
class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self = self.__class__(new_list)
return self
my_list = MyList(list(range(5)))
print(my_list)
print(my_list.append_(6))
print(my_list)
它打印错误的输出,而不是修改列表:
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 2, 3, 4]
此外,您可以更改append_()
函数以获得所需的功能:
class MyList(list):
def append_(self, element):
self.append(element)
my_list = MyList(list(range(5)))
print(my_list)
print(my_list.append_(6))
print(my_list)
输出:
[0, 1, 2, 3, 4]
None
[0, 1, 2, 3, 4, 6]
哦,我终于又尝试了一件事:
class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self.__init__(new_list)
return self
最终按预期工作。 不过,我不确定我是否理解为什么,所以如果有人想详细说明这个可行的解决方案,我会很高兴:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.