【问题标题】:AttributeError when calling class2 within class1, class1 has no __init__ attribute在class1中调用class2时出现AttributeError,class1没有__init__属性
【发布时间】:2019-06-03 01:51:40
【问题描述】:

我是 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

我试图避免在Class2 的每个新函数中重复将y 定义为x,所以我想我可以将Class2x 一起运行,然后将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)

但是当我在 shell 中输入 test.function2(2) 并按预期返回 7 时,这可以正常工作。

我想我一定是误解了如何使用Class2,但我无法弄清楚我做错了什么。

Class2 的每个函数中不只定义x 的情况下,如何消除此错误?

【问题讨论】:

    标签: python class init


    【解决方案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 本身,这没有意义。

    【讨论】:

    • 再次感谢您教我一些东西!我希望我能接受你的回答以及 Rahul 的回答。
    【解决方案2】:

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

     answer=Class2.function2(Class2,number)
    

    改成

     answer = test.function2(number)
    

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

    【讨论】:

    • 抱歉,下次我会尽量说清楚一点。非常感谢,这正是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多