Let's go through the call to a.method2.
- You call a.method(). This returns a new instance ofA
- This new instance is passed to a.method2as the local variablef
- You then attempt to call a.f(throughself), butfis an instance
You aren't calling self.<some_function>, you are trying to say that an instance of A has an attribute that is also an instance of A, which is not the case. It's effectively doing:
a.A(a.x+1, a.y+1).x
Which raises your error. Yes, an instance of A has the attribute x, but no instance of A has an attribute matching this new instance. It's not totally clear what you are trying to accomplish. If you are trying to test the value of the attribute on a new instance, you might just do:
class A:
    def __init__(self, x
        self.y = y
    def method(self):
        return A(self.x + 1, self.y + 1)
    def method2(self):
        # just check the value itself
        if self.x > 3:
            return True
        else:
            return False
a = A(1, 2)
# b is a new instance, you shouldn't be testing values of b
# via some function in a, because really this function
# exists in all instances, including b
b = a.method()
# so check b.x through the instance b instead
b.method2()
False