Method returning new instance of class?

Arthur ajsiegel at optonline.com
Sun Sep 5 08:37:56 EDT 2004


"Jp Calderone" <exarkun at divmod.com> wrote in message
news:mailman.2870.1094319247.5135.python-list at python.org...
> Arthur wrote:
> > "Martin v. L=F6wis" <martin at v.loewis.de> wrote in message
> > news:4139a87a$0$30204$9b622d9e at news.freenet.de...
> > =
>>Copy.deepcopy doesn't work for more
> > obscure reasons.  I get an error message generating up from vpython when
I
> > try to change an attribute of the object on the new instance  - though I
=
> am
> > interacting with it in the same manner that works fine when performed on
=
> the
> > original instance.
> > =
>
> > But do you see any reason why this might be?
> > =
>    It sounds terribly logical.  Copying objects is extremely difficult =
>
> to do correctly.  There is no way to do it generically and correctly. =
>
> Make the copy too shallow, and you get unwanted shared state.  Make the =
>
> copy too deep and the new object is useless.  How do you decide how deep =
>
> is deep enough?  You can't, at least not without intimate knowledge of =
>
> the object you're dealing with.
>
>    Once you figure out exactly how deep you need to make your copy, you =
>
> can tell copy.deepcopy() how to behave with the copy_reg module.  Of =
>
> course, since this knowledge is quite closely tied to VPython, it should =
>
> really be *part* of the VPython package, so that changes to the =
>
> internals of VPython can be made right alongside changes to the code =
>
> which knows how to copy its objects.


Well a quick look at copy_reg and I backed away.  Particularly since I am
accessing the internet from a dial-up at the moment and am not in a position
to do the research necessary to get a handle on it.  The module docs are
much too sketchy here for someone starting with this from where I am
starting. And as you say, there looked like I might need to get at VPython
internals to do it correctly.

However I did realize, in reading the docs, that overriding __copy__ might
be all I needed to do.  Really what I was looking for was a copy of the
original instance with a fresh VPython object on which to operate.
Conceptually I am doing a non-destructive transformation of the instance,
with the transformed object the same, exscept at a transformed location.
Something like this seemed to work:

def __copy__(self):
   newcopy=copy.deepcopy(self)
  newcopy.vpythonobject=<intialize new vpython object here>
  return newcopy

But before getting too far into testing whether this accomplished the copy I
was looking for (perhaps the success was more apparent than real, and the
advice to resort to copy_reg is more unavoidable than I understand) I
realized that I had misconceived something more fundamental.  That the
normal instance creation process involves registerting the new instance with
the app in various ways, and that a copy won't accomplish this.

That is until wrote the last paragraph, and realized that I might be able to
throw the registration routines into the __copy__ method.

Hmmm.

Let's try.

Art





More information about the Python-list mailing list