Could this be a `collections.namedtuple` instead? (and some of the classes below)