访问父类数据成员时出现TypeError

2024-06-26 14:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用两个堆栈创建一个队列,下面是我的代码:-

class Stack1(object):
    def __init__(self):
        super(Stack1, self).__init__()
        self.stack1 = []

    def push(self, item):
        self.stack1.append(item)
    def pop(self):
        self.popped_value = self.stack1.pop()       
        print("popped_value parent", self.popped_value)
        return self.popped_value
    def peek(self):
        try:
            return self.stack1[len(stack1)-1]
        except:
            print("Cannot peek into stack 1")
    def is_empty(self):
        if len(self.stack1) == 0:
            return True
        else:
            return False
    def display(self):
        print(self.stack1)

class Stack2(Stack1):
    def __init__(self):
        super(Stack2).__init__()
        self.stack2 = []        

    def push(self, popped):
        self.popped = popped
        return self.stack2.append(self.popped)
    def pop(self):
        return self.stack2.pop()
    def peek(self):
        try:
            return self.stack2[len(stack2)-1]
        except:
            print("Cannot peek into stack 2")
    def is_empty(self):
        if len(self.stack2) == 0:
            return True
        else:
            return False
    def display(self):
        print(self.stack2)
class DoubleStackQueue(Stack2):     
    def __init__(self):
        super(DoubleStackQueue, self).__init__()
        pass    
    def enqueue(self, item):
        self.item = item
        super(DoubleStackQueue, self).push(self.item)       
        Stack1.push(self.item)

dsq = DoubleStackQueue()
dsq.enqueue(2)

在这里,我试图通过访问类stack1的push()方法将一个项推送到stack1。但是,我得到以下错误:

E:\>python dsq.py
Traceback (most recent call last):
  File "dsq.py", line 78, in <module>
    dsq.enqueue(2)
  File "dsq.py", line 75, in enqueue
    Stack1.push(self.item)
TypeError: push() missing 1 required positional argument: 'item'

你能帮帮我吗


Tags: selfreturninitvaluedefitempoppush
1条回答
网友
1楼 · 发布于 2024-06-26 14:12:13

当您直接从类调用实例方法时,就像您通过调用Stack1.push所做的那样,您需要显式地提供self参数:

Stack1.push(self, self.item)

在调用Stack1.push(self.item)中,self.item作为self参数传递,解释器会引发错误,因为它缺少其他必需的位置参数item

或者使用super

super(Stack2, self).push(self.item)

上面写着:

  • 我相信你的代码很乱。我非常确定Stack2.push方法应该负责调用Stack1.push,这样DoubleEndedQueue就不需要执行双重调用
  • 您可以用self.push.item替换super(DoubleEndedQueue, self).push(self.item)。。。由于DoubleEndedQueue没有定义push方法,因此将自动检查超类Stack2

相关问题 更多 >