Какой аргумент просит функция в классе Python: "TaskNumber1() missing 1 required positional argument: 'self'"
Сам код:
class TasksForMath:
def TaskNumber1(self):
print("\nПоезд ехал со скоростью 110 км/ч. С такой же скоростью он ехал 6 часов.\nКакое расстояние преодолел поезд за эти 6 часов?")
while True:
now_execute_number = 1
print(f"Задача номер {now_execute_number}")
TasksForMath.TaskNumber1()
А ошибка:
File "C:\Users\FleshStinger\Desktop\Задачи.py", line 10, in <module>
TasksForMath.TaskNumber1()
TypeError: TaskNumber1() missing 1 required positional argument: 'self'
Что я хотел сделать: я хочу чтобы у меня вызвалась функция из класса TasksForMath "TaskNumber1()", но он просит аргумент. Я добавил аргумент self но выдаёт ошибку. Что делать?
Ответы (3 шт):
Сначала вы определитесь: статичный метод или метод объекта?
Статичный
Статичный может вызываться самим типом (или объектами типам), как тут:
TasksForMath.task_number_1()
У статичных методов нет аргумента self и им нужно указывать декоратор @staticmethod:
class TasksForMath:
@staticmethod
def task_number_1():
...
Метод объекта
Метод объекта может вызываться исключительно объектами:
tasks = TasksForMath()
tasks.task_number_1()
Для этих методов обязателен аргумент self:
class TasksForMath:
def task_number_1(self):
...
Метод класса
Метод класса очень похож на статичный метод: может вызываться самим типом (или объектами типам), как тут:
TasksForMath.task_number_1()
Но есть одна фишка -- обязательная передача аргумента cls в методы класса и указание декоратора @classmethod:
class TasksForMath:
@classmethod
def task_number_1(cls):
...
Это позволит в методах класса при обращении с cls вызывать поля и методы класса
Т.к. TaskNumber1 не является classmethod, то для его вызова необходимо создать объект класса, в котором определён этот метод.
Просто добавив две круглые скобки в ваш фрагмент кода, мы получаем приемлемый результат:
class TasksForMath:
def TaskNumber1(self):
print("\nПоезд ехал со скоростью 110 км/ч. С такой же скоростью он ехал 6 часов.\nКакое расстояние преодолел поезд за эти 6 часов?")
while True:
now_execute_number = 1
print(f"Задача номер {now_execute_number}")
TasksForMath().TaskNumber1()
Обратите внимание на то, что цикл бесконечен.
Если не хотите создавать экземпляр класса, то воспользуйтесь декоратором @classmethod:
class TasksForMath:
@classmethod
def TaskNumber1(cls):
print("\nПоезд ехал со скоростью 110 км/ч. С такой же скоростью он ехал 6 часов.\nКакое расстояние преодолел поезд за эти 6 часов?")
while True:
now_execute_number = 1
print(f"Задача номер {now_execute_number}")
TasksForMath().TaskNumber1()
Просто уберите self из аргументов функции, если не хотите, чтобы это был метод экземпляра класса, а хотите, чтобы это был статический метод, который можно вызывать, используя название класса:
class TasksForMath:
def TaskNumber1():
print("\nПоезд ехал со скоростью 110 км/ч. С такой же скоростью он ехал 6 часов.\nКакое расстояние преодолел поезд за эти 6 часов?")
now_execute_number = 1
print(f"Задача номер {now_execute_number}")
TasksForMath.TaskNumber1()
Цикл я убрал, потому что он бесконечный. Вывод:
Задача номер 1
Поезд ехал со скоростью 110 км/ч. С такой же скоростью он ехал 6 часов.
Какое расстояние преодолел поезд за эти 6 часов?