我想在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,如果它有帮助…
代码似乎没有问题,因为我能够正常运行
与repl
一起使用也许试着把代码放到一个新文件
"_"是问题吗
哦,我终于又试了一件事:
class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self.__init__(new_list)
return self
最终按预期工作。我不确定我明白为什么,虽然,所以如果有人想详细说明这个工作解决方案,我会很高兴:-)
由于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]