A possibility would be to remove the .copy method and to add a general facility to make a copy of an object with different attributes:

  import copy

  def new(obj, **kwargs):
        new_obj = copy.copy(obj)
        vars(obj).update(kwargs)
        return newobj

What to you think? This is a feature general enough that the name `new` is justified.