【问题标题】:Python - class using pop() [closed]Python - 使用 pop() 的类 [关闭]
【发布时间】:2014-01-28 13:20:06
【问题描述】:

我在 python 中遇到了堆叠问题。在一个有 4 个函数的类中,我需要使用 pop()。但它不会按我想要的方式工作,或者我的列表有问题。

谁能帮帮我。

class myStack(list):

    def __init__(self,a=[]):
        list.__init__(self,a)

    def push(self, x):
        self.append(x)

    def pop(self):
        return self.pop()

    def peek(self):
        return self[-1]

    def emptyStack():
        if list.count != 0:
            return False
        else:
            return True

    c = myStack(list())
    c.push(3)
    c.push(5)
    c.push(7)
    print(c)
    print(c.peek())
    c.pop()
    print(c)

【问题讨论】:

  • “它不会按照我想要的方式工作,或者我的列表有问题。” 那么,它是崩溃了,还是什么?请提供更多细节。
  • 如果你从list继承,你甚至不需要定义pop(),因为你的定义和list.pop()是一样的。本着同样的精神,您可以将push 简单地定义为push = list.append
  • 值得注意的是,MyStack.__init__ 的可变默认参数可能会给您带来麻烦... 将其设为 __init__(self, a=None) 并在必要时在方法内创建一个空列表 (if a is None:)

标签: python function class


【解决方案1】:

您正在对list 进行子类化,但list 已经提供了您定义的一些方法。如果您不想要 list 的全部功能,最好不要使用继承。

class MyStack(object):
    def __init__(self, *args):
        self._stack = list(args)

    def push(self, x):
        self._stack.append(x)

    def pop(self):
        return self._stack.pop()

    def peek(self):
        return self._stack[-1] if not len(self._stack) else None

    def emptyStack():
        return not len(self._stack)

【讨论】:

    【解决方案2】:

    您可以使用传递的self 作为第一个参数调用list.pop

    def pop(self):
        return list.pop(self)
    

    或超级:

    def pop(self):
        return super(myStack, self).pop()
    

    【讨论】:

      【解决方案3】:

      这将递归调用自身:

      def pop(self):
          return self.pop()
      

      你可能是说

      def pop(self):
          return list.pop(self)
      

      【讨论】:

      • 如果我使用它,我会得到以下结果 [3, 5, 7] 7 Traceback(最近一次调用最后一次):文件“D:\Python Workspace\ALDS\week2\week2_2.py”,第 33 行,在 c.pop() 文件 "D:\Python Workspace\ALDS\week2\week2_2.py",第 16 行,在 pop 返回 self.list.pop() AttributeError: 'myStack' object has no属性“列表”
      • super(MyStack, self).pop() 将是这个的正确版本。 self 在上面的实现中没有list 属性
      • 或者只是return list.pop(self),如果你想避免super无论出于什么原因。
      • @chepner 好的,改变了我的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      相关资源
      最近更新 更多