Как правильно использовать функции в классе?

#python #function #class #methods

#python #функция #класс #методы

Вопрос:

У меня возникли трудности с реализацией функций в классе ArrayQ. Задача состоит в том, чтобы создать класс и иметь в нем три метода, enqueue, dequeue и isEmpty. В «self.array.append (self.array)» Я не совсем уверен, должно ли это быть 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)» для изменения моего списка с помощью функции или метода, написанного в классе?

Комментарии:

1. Первая проблема заключается в том, что в коде неверный отступ.

2. Пожалуйста, ознакомьтесь с этой серией руководств, чтобы понять концепцию классов. Ссылка : youtube.com/watch?v=ZDa-Z5JzLYM

3. @mkrieger1, это предназначено правильно, это мой первый вопрос stackoverflow, поэтому я, по-видимому, неправильно вставил здесь код, но он точен в моей программе.

4. @TanishqVyas, спасибо! Я слышал о руководствах Кори Шафера. Я обязательно посмотрю их!

Ответ №1:

Ваша проблема здесь.

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

Этот метод принимает один параметр: self . Это ссылка на этот объект, поэтому, если у вас classmethod нет методов вашего класса, они должны иметь self параметр в качестве первого параметра.

Теперь ваша basictest() функция вызывает a q.enqueue(1) , но ваш объект q является a ArrayQ , и его enqueue функция имеет только один параметр: self . Это неявно, вы не можете использовать 1 as self . Итак, отредактируйте enqueue таким образом:

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

Комментарии:

1. искренне благодарю вас, теперь я вижу, в чем проблема!

2. Теперь у меня следующая проблема: мой basictest() не работает, как вы можете видеть в: imgur.com/BIGLngp . Я вроде бы заставляю его работать сейчас, но базовый тест немного запутывается. Разве не обязательно вводить аргумент в скобках в «q = ArrayQ ()», я имею в виду, что вы должны предоставить ему список для обработки, верно? Мне также интересно, как структурирована тестовая функция. Я не получаю «test OK». Разве не предполагается, что список заполняется «1» и «2», а затем он очищается. Итак, почему «x = q.dequeue ()» должно иметь значение 1?

3. У вас есть эта проблема, потому что dequeue() возвращает None , поэтому оба x и y равны None . Вы должны отредактировать dequeue() функцию с return self.array.pop(0) помощью as body .

4. о, хорошо, я понимаю! Теперь x и y имеют значения. Нужно ли мне также редактировать enqueue() и / или isEmpty() включать return ?

5. Ну, если вы хотите управлять возвращаемым значением, да. Вы могли бы редактировать enqueue() добавление return value и isEmpty() с return len(self.array) == 0

Ответ №2:

Прежде всего, в классе «ArrayQ» имеется неправильный отступ. И, во-вторых, в определении метода «enqueue» передается только один аргумент по умолчанию. Когда вы создаете экземпляр объекта, сам объект передается в качестве аргумента по умолчанию (self). В «q.enqueue (1)» вы фактически передаете два параметра, первый — self, а второй — «1».

Комментарии:

1. спасибо, что просветили меня о концепции создания экземпляра объекта! Что касается отступов, я боюсь, что он предназначен правильно. Это мой первый вопрос stackoverflow, поэтому я, по-видимому, неправильно вставил здесь код, но он точен в моей программе.

2. Теперь у меня следующая проблема: мой basictest() не работает, как вы можете видеть в: imgur.com/BIGLngp . Я вроде бы заставляю его работать сейчас, но базовый тест немного запутывается. Разве не обязательно вводить аргумент в скобках в «q = ArrayQ ()», я имею в виду, что вы должны предоставить ему список для обработки, верно? Мне также интересно, как структурирована тестовая функция. Я не получаю «test OK». Разве не предполагается, что список заполняется «1» и «2», а затем он очищается. Итак, почему «x = q.dequeue ()» должно иметь значение 1?