class sequence: # don't make sequence() directly def __init__(self, value=[]): self.data = self.empty() # empty is virtual self.concat(value) def convert(self, Maker): new = Maker() new.concat(self.data) return new def concat(self, items): # "in" is generic for x in items: self.add(x) # add is virtual def to_string(self): return String(self.data) def to_list(self): return List(self.data) def to_tuple(self): return Tuple(self.data) def __repr__(self): return `self.data` class List(sequence): def empty(self): return [] def add(self, item): self.data.append(item) class String(sequence): def empty(self): return '' def add(self, item): self.data = self.data + item class Tuple(sequence): def empty(self): return () def add(self, item): self.data = self.data + (item,) if __name__ == "__main__": x = List("spam") print x, x.convert(String), x.to_tuple() y = String("eggs") print y, y.convert(Tuple), y.to_list()