【问题标题】:How to correctly use functions in a class?如何正确使用类中的函数?
【发布时间】:2020-12-13 11:41:48
【问题描述】:

我在实现类 ArrayQ 中的函数时遇到了困难。任务是创建一个类并在其中包含三个方法,入队、出队和 isEmpty。在“self.array.append(self.array)”中,我不确定它是否应该是数组、self.array、self 或括号中的其他内容。下面的 basictest() 函数用于控制我们的类是否正常工作,但目前还没有。

from array import array
    
class ArrayQ:
    def __init__(self,array):
        self.array = array

    def enqueue(self):
        self.array.append(self.array)

    def dequeue(self):
        self.array.pop(0)

    def isEmpty(self):
        if not self.array:
            print("queue is empty")

#print(ArrayQ)
lista = []

def basictest():
    q = ArrayQ(lista)
    q.enqueue(1)
    q.enqueue(2)
    x = q.dequeue()
    y = q.dequeue()
    if (x == 1 and y == 2):
        print("test OK")
    else:
        print("FAILED expexted x=1 and y=2 but got x =", x, " y =", y)
    
basictest()

我收到以下错误消息:

Traceback (most recent call last):
  File "d1.py", line 31, in <module>
    basictest()
  File "d1.py", line 22, in basictest
    q.enqueue(1)
TypeError: enqueue() takes 1 positional 
argument but 2 were given

那么任何人都可以指导我如何解决这个问题,以便我可以使这段代码正常工作吗?在这段代码中可能出现的几个错误中,为什么我不能使用“q.enqueue(1)”来使用类中编写的函数或方法来更改我的列表?

【问题讨论】:

  • 第一个问题是代码没有正确缩进。
  • 请阅读本教程系列以了解类的概念。链接:youtube.com/watch?v=ZDa-Z5JzLYM
  • @mkrieger1,它的意图是正确的,这是我的第一个 stackoverflow 问题,所以我显然没有正确粘贴代码,但它在我的程序中是准确的。
  • @TanishqVyas,谢谢!我听说过 Corey Schafer 的教程。我一定会看的!

标签: python function class methods


【解决方案1】:

你的问题就在这里。

def enqueue(self):
    self.array.append(self.array)

此方法采用一个参数:self。它是该对象的引用,因此,除非您有 classmethod,否则您的类方法必须self 参数作为第一个参数。

现在,您的 basictest() 函数调用了 q.enqueue(1),但您的对象 q 是 ArrayQ,并且它的 enqueue 函数只有一个参数:self。这是隐含的,您不能将1 用作self。 所以,以这种方式编辑enqueue

def enqueue(self, value):
    self.array.append(value)

【讨论】:

  • 真的非常感谢,现在我知道问题出在哪里了!
  • 我现在遇到了以下问题:我的 basictest() 无法正常工作,如您所见:imgur.com/BIGLngp。我现在有点让它工作,但基本测试有点混乱。 “q = ArrayQ()”中的括号中不是必须要输入参数吗,我的意思是你必须给它一个列表来处理,对吧?我也想知道测试功能是如何构成的。我没有得到“测试OK”。是不是假设列表被“1”和“2”填充,然后被清空。那么为什么“x = q.dequeue()”的值应该是1呢?
  • 你遇到了这个问题,因为dequeue() 返回 None,所以 x 和 y 都是 None。您必须以 return self.array.pop(0) 为主体来编辑 dequeue() 函数。
  • 哦,好的,我明白了!现在 x 和 y 确实有值。我是否还需要编辑enqueue() 和/或isEmpty() 以包含return
  • 好吧,如果你想管理一个有价值的回报是的。您可以编辑enqueue() 添加return valueisEmpty()return len(self.array) == 0
【解决方案2】:

首先,“ArrayQ”类中的缩进不正确。其次,"enqueue" 方法定义中只传递了一个默认参数。当您创建对象的实例时,对象本身作为默认参数 (self) 传递。在 "q.enqueue(1)" 中,您实际上传递了两个参数,第一个是 self,第二个是 "1"。 p>

【讨论】:

  • 感谢您启发我了解对象实例创建的概念!关于缩进,恐怕它是正确的。这是我的第一个 stackoverflow 问题,所以我显然没有在此处正确粘贴代码,但它在我的程序中是准确的。
  • 我现在遇到以下问题:我的 basictest() 无法正常工作,如您在 imgur.com/BIGLngp 中所见。我现在有点让它工作,但基本测试有点混乱。 “q = ArrayQ()”中的括号中不是必须要输入参数吗,我的意思是你必须给它一个列表来处理,对吧?我也想知道测试功能是如何构成的。我没有得到“测试OK”。是不是假设列表被“1”和“2”填充,然后被清空。那么为什么“x = q.dequeue()”的值应该是1呢?
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多