【问题标题】:in-place append while subclassing a list in Python在 Python 中对列表进行子类化时就地追加
【发布时间】:2022-07-04 23:40:04
【问题描述】:

我想在 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,如果有帮助的话...

【问题讨论】:

    标签: python arrays list append subclass


    【解决方案1】:

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

    Works with repl

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

    【讨论】:

      【解决方案2】:

      哦,我终于又尝试了一件事:

      class MyList(list):
          def append_(self, element):
              new_list = list(self)
              new_list.append(element)
              self.__init__(new_list)
              return self
      

      最终按预期工作。不过,我不确定我是否理解为什么,所以如果有人想详细说明这个可行的解决方案,我会很高兴:-)

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-09
          • 2020-12-18
          • 2021-08-14
          • 2017-07-17
          • 2014-05-09
          • 2016-03-06
          相关资源
          最近更新 更多