在class1中调用class2时发生AttributeError,class1没有__init__属性

时间:2019-06-03 01:51:40

标签: python class init

我是OOP的新手,正在尝试使用两个类。我试图提供直到Class1运行到Class2才创建的属性,但是运行Class1时出现AttributeError。

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,所以我认为我可以只用{{1 }},然后使用带有数字的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的情况下消除此错误?

2 个答案:

答案 0 :(得分:1)

原因是这一行:

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本身,没有任何意义。

答案 1 :(得分:0)

很难理解您的代码,但这一行是一个明显的错误。

 answer=Class2.function2(Class2,number)

将其更改为

 answer = test.function2(number)

当通过使用必需的init参数调用对象来创建对象时,在调用类的函数时无需传递self参数。它会自动传递。