繁体   English   中英

在 Python 中对列表进行子类化时就地追加

[英]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,如果它有帮助的话......

代码似乎没有问题,因为我能够正确运行它

与 repl 一起工作

也许尝试将代码放在一个新文件中

“_”是问题所在

由于您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM