1

I'm new to OOP and am trying to use two classes. I'm trying to feed an attribute that isn't created until Class1 is run to Class2, but I'm getting an AttributeError when I run 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

I'm trying to avoid repetition of defining y as x in every new function in Class2, so I thought I could just run Class2 with x and then use function2 with number to print 7. Instead I get: AttributeError: type object 'Class2' has no attribute 'y'.

Originally I thought I was misunderstanding __init__, so I ran this code to make sure:

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)

But this works fine when I type test.function2(2) into the shell, returning 7 as expected.

I think I must be misunderstanding how to use Class2, but I can't figure out what I'm doing wrong.

How do I get rid of this error without just defining x in every function in Class2?

2 Answers 2

1

The reason is this line:

answer = Class2.function2(Class2, number)

First, we must note that the following are equivalent:

class A:

    def method(self):
        pass

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

I believe you want to do something like this:

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

If we perform the above conversion, that would be the same as this:

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

Note that your original code is missing () after Class2, which means that instead of passing an instance of Class2 to the method, you are passing the type object Class2 itself, which doesn't make sense.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you again for teaching me something! I wish I could accept your answer as well as Rahul's.
0

It is very difficult to understand your code but one obvious mistake is at this line.

 answer=Class2.function2(Class2,number)

Change it to

 answer = test.function2(number)

When you create object by calling it with required init argument, you don't need to pass self parameter while calling functions of the class. It is automatically passed.

1 Comment

Sorry about that, I'll try to be clearer next time. Thank you so much, that's exactly what the problem was.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.