code: def _clone(self):
          
  
          cls = self.__class__
          obj = cls.__new__(cls)
          obj.items = list(self.items)
          return obj
docs: Make a (shallow) copy of the set.
  
          There is a 'clone protocol' that subclasses of this class
          should use.  To make a copy, first call your super's _clone()
          method, and use the object returned as the new instance.  Then
          make shallow copies of the attributes defined in the subclass.
  
          This protocol allows us to write the set algorithms that
          return new instances (e.g. union) once, and keep using them in
          subclasses.