Example1 - Point: >>> from point import Point >>> print(Point.x) ==> x belongs to an object/instace of type Point, not to Point class Traceback(most recent call last): File "", line 1, in AttributeError: type object 'Point' has no attribute 'x' >>> Point.y = 17 >>> p = Point(3, 5) >>> print(p) (3.0, 5.0) >>> Point.y 17 >>> Point.__dict___ ==> you will see 'y': 17 entry in the class namespace >>> p.__dict__ ==> {'x': 3.0, 'y': 5.0} => has 'y' attribute in the object namespace Example2 - Point: Add z = 40.0 to class Point (before __init__, right after the class docstring) >>> from point import Point >>> p1 = Point(3,4) >>> Point.__dict__ ==> you should see z among the items >>> p1.__dict__ ==> {'x': 3.0, 'y': 4.0} >>> p1.z 40.0 >>> p2 = Point(3, 5) >>> p2.z 40.0 >>> p2.z = 5.5 ==> added a new z in p2's namespace >>> p2.z ==> will look up first in the object namespace, then in the class namespace 5.5 >>> p2.__dict__ ==> {'x': 3.0, 'y': 4.0, 'z': 5.5} >>> p1.z ==> will look up first in the object namespace, then in the class namespace 40.0 >>> p1.__dict__ ==> {'x': 3.0, 'y': 4.0} >>> Point.z = 7.7 >>> p2.z ==> p2 has the z that belongs to the object namespace, which takes priority. 5.5 >>> p1.z ==> p1 does not have z in its object namespace, finds z in class namespace instead. 7.7 Please note that while we do not expect you to know these intricate details or test you on this, we do encourage you to try things yourselves and practice to get more experience with the language, as part of learning about the true goal here: getting a good understanding of object-oriented programming.