отсутствует 1 требуемый позиционный аргумент: ‘self’ при использовании classmethod в staticmethod

#python-3.x

#python-3.x

Вопрос:

Я пишу класс Person на Python 3.8. Когда я использую calc_all() метод для вычисления дохода для каждого экземпляра в instances , я получаю ошибку. Код:

 import math
class Person:
    instances = []
    @classmethod
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.level = 1
        self.job = ""
        self.work_place = None
        Person.instances.append(self)
    def do_level(self,income):
        return income*math.sqrt(self.level*self.work_place.level)
    def calc_income(self):
        pass
    def calc_life_cost(self):
        pass
    def calc(self):
        income = self.calc_income()
        cost = self.calc_life_cost()
        return self.do_level(income) - cost
    @staticmethod
    def calc_all():
        zigma = 0
        for instance in Person.instances:
            zigma = zigma   instance.calc()
        return zigma

p = Person('X',12)
p2 = Person('Y',15)
print(Person.calc_all())
  

Ошибка:

 zigma = zigma   instance.calc()
TypeError: calc() missing 1 required positional argument: 'self'
  

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

1. Какой смысл имеет строка Person.instances.append(self) . Правильно ли он добавляется???

2. Вы хотите добавить имя, возраст и т.д. В список экземпляров????

3. @Arpit Я не уверен в своем коде, но когда я его распечатаю: [<__main__.Person object at 0x000001F4C094E488>, <__main__.Person object at 0x000001F4C094E4C8>] Мне нужен список всех объектов person

4. Что вы в основном хотите добавить в свой список экземпляров???

5. @Arpit каждый объект person, который я создаю

Ответ №1:

Чего вы пытаетесь достичь, создавая __init__ classmethod? Вы могли бы свободно удалить его. После этого у вас все равно будет ошибка, поскольку self.work_place не имеет уровня атрибута.

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

1. Я воспроизвел ваш код и получаю ошибку реализации, вам следует добавить реализации для calc_income и calc_life_cost , приветствия. И удалите @classmethod из __init__ , вам это не нужно.

2. Проблема заключалась в @classmethod, спасибо