The representation invariant defines which values of the data attributes correspond to valid representations of class instances. The representation invariant for IntSet is that vals contains no duplicates. The implementation of __init__ is responsible for establishing the invariant (which holds on the empty list), and the other methods are responsible for maintaining that invariant. class IntSet(object): def __init__(self): """Create an empty set of integers""" self.vals = [] def insert(self, e): """Assumes e is an integer and inserts e into self""" if not e in self.vals: self.vals.append(e) def member(self, e): """Assumes e is an integer Returns True if e is in self, and False otherwise""" return e in self.vals def remove(self, e): """Assumes e is an integer and removes e from self Raises ValueError if e is not in self""" try: self.vals.remove(e) except: raise ValueError(str(e) + ' not found') def getMembers(self): """Returns a list containing the elements of self. Nothing can be assumed about the order of the elements""" return self.vals[:] I really have no I idea what does above explanation of representation invariant means. Is there simpler explanation of it? "The representation invariant for IntSet is that vals contains no duplicates." does that mean it is the vals in that def __init__(self) one. I am really confused. Thanks for anyone who helped! Continue reading...