#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?