Copying objects style questions

Alex Martelli aleax at aleax.it
Wed Aug 6 06:23:16 EDT 2003


Bob Halley wrote:
   ...
> I can't use copy.copy()'s default behavior, because it is too shallow.
> I don't want to use copy.deepcopy() because it's too deep.  I

So far, so perfectly clear.

> contemplated __copy__, __initargs__, __getstate__, and __setstate__,
> but they didn't seem to fit the bill, or seemed more complicated than
> the solution I ended up with (see below).

I don't understand this.  What's wrong with, e.g.:

def __copy__(self):
    class EmptyClass: pass
    obj = EmptyClass()
    obj.__class__ = self.__class__
    obj.__dict__.update(self.__dict__)
    obj.items = list(self.items)
    return obj

???  It seems simpler and more automatic than your 'copy protocol';
subclasses don't need to do anything special unless they need to
"deepen" the copy of some of their attributes.  Btw, if you're
using new-style classes, you'll want to use object instead of
EmptyClass, or start with obj = self.__class__.new(self.__class__)
as you're doing in your protocol, of course -- but the key idea
is "bulk copy all that's in self's __dict__, then special-case
only what little needs to be specialcased".  And doing it in a
method called __copy__ means any user of your class needs not
learn about a new copy protocol but rather just uses copy.copy.

It may be that I'm not correctly understanding your issues, of
course, but I hope these suggestions can help.


Alex





More information about the Python-list mailing list