Какой аргумент просит функция в классе 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 шт):

Автор решения: gil9red

Сначала вы определитесь: статичный метод или метод объекта?


Статичный

Статичный может вызываться самим типом (или объектами типам), как тут:

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 вызывать поля и методы класса

→ Ссылка
Автор решения: my diamonds dancing

Т.к. 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()
→ Ссылка
Автор решения: CrazyElf

Просто уберите 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 часов?
→ Ссылка