AttributeError при вызове class2 внутри class1, class1 не имеет атрибута __init__ - PullRequest
1 голос
/ 03 июня 2019

Я новичок в ООП и пытаюсь использовать два класса. Я пытаюсь передать атрибут, который не создается, пока Class1 не будет запущен до Class2, но я получаю AttributeError, когда я запускаю Class1.

class Class1():
    #some code....

    def function1():
        x=5
        number=2
        test=class2(x)

        answer=Class2.function2(Class2,number)
        print(answer)    

class Class2():
    def __init__(self, y):
        self.y=y

    def function2(self, z):
        calculated_answer=self.y+z
        return calculated_answer

    #several more functions that also use y

Я пытаюсь избежать повторения определения y как x в каждой новой функции в Class2, поэтому я подумал, что могу просто запустить Class2 с x и затем использовать function2 с номером напечатать 7. Вместо этого я получаю: AttributeError: type object 'Class2' has no attribute 'y'.

Первоначально я думал, что я неправильно понял __init__, поэтому я запустил этот код, чтобы убедиться:

class Class2():
    def __init__(self, y):
        self.y=y

    def function2(self, z):
        calculated_answer=self.y+z
        return calculated_answer

x=5
test=class2(x)

Но это прекрасно работает, когда я набираю test.function2(2) в оболочке, возвращая 7, как и ожидалось.

Я думаю, что я неправильно понимаю, как использовать Class2, но я не могу понять, что я делаю неправильно.

Как избавиться от этой ошибки, не определяя x в каждой функции в Class2?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Причина в этой строке:

answer = Class2.function2(Class2, number)

Во-первых, мы должны отметить, что следующие условия эквивалентны:

class A:

    def method(self):
        pass

A().method()
A.method(A())

Я считаю, что вы хотите сделать что-то вроде этого:

class2 = Class2()
answer = class2.function2(number)

Если мы выполним приведенное выше преобразование, оно будет таким же, как это:

answer = Class2.function2(Class2(), number)

Обратите внимание, что ваш исходный код отсутствует () после Class2, что означает, что вместопередавая экземпляр Class2 методу, вы передаете сам объект типа Class2, что не имеет смысла.

0 голосов
/ 03 июня 2019

Очень сложно понять ваш код, но одна очевидная ошибка в этой строке.

 answer=Class2.function2(Class2,number)

Измените его на

 answer = test.function2(number)

Когда вы создаете объект, вызывая его с требуемымаргумент init, вам не нужно передавать параметр self при вызове функций класса.Он автоматически передается.

...