__deepcopy__ without recursive copies?

B

Bernie

#!/usr/bin/env python
import sys
import copy

'''
How to define __deepcopy__ with out causing recursive calls to copies
of self?

Bernie Day 01/25/05

I was using deepcopy on DeviceManager and this worked well. When I
defined
__deepcopy__, so I could have a handle to the children of the Master
device Manager
I got into trouble.
I see that there is a method using a dic to limit this, but I can't
seem to get it to work.

This is not the code I was using but should represent it well.

Thanks!
'''


class DeviceManager:
def __init__(self,devFile):
DevFile = open(devFile)
devList = [Device(line) for line in DevFile]
#etc, etc...
def __deepcopy__(self):
miniMe = copy.deepcopy(self)
miniMe.devList = tuple(devList)
return miniMe
class Device:
def __init__(self,line):
self.copyies = []
#do something with line here
def __deepcopy__(self):
miniMe = copy.deepcopy(self)
self.copyies.append(miniMe)
return miniMe

DevMan1 = DeviceManager(devfile)
devMan2 = copy.deepcopy(DevMan1)
 
W

wittempj

Here I found something on __deepcopy__
http://groups-beta.google.com/group..._doneTitle=Back+to+Search&&d#427866340239edd7

if applied on your script it gives something like:
-import copy
-class DeviceManager(object):
- def __init__(self,devFile):
- DevFile = open(devFile)
- devList = [Device(line) for line in DevFile]
- #etc, etc...
-
- def __deepcopy__(self, memo):
- x = DeviceManager.__new__(DeviceManager)
- memo[id(self)] = x
- for n, v in self.__dict__.iteritems():
- setattr(x, n, copy.deepcopy(v, memo))
- return x
-
-class Device(object):
- def __init__(self,line):
- self.copies = []
- #do something with line here
-
- def __deepcopy__(self, memo):
- x = Device.__new__(Device)
- memo[id(self)] = x
- for n, v in self.__dict__.iteritems():
- setattr(x, n, copy.deepcopy(v, memo))
- return x
-
-DevMan1 = DeviceManager(r'c:\autoexec.bat')
-DevMan2 = copy.deepcopy(DevMan1)
-
-print DevMan1 is DevMan2
it prints False, so the deepcopy seems to work
 
W

wittempj

In this thread a solution is given on how to work with __deepcopy__:
http://groups-beta.google.com/group..._doneTitle=Back+to+Search&&d#427866340239edd7

For you this would give something like:
-import copy
-class DeviceManager(object):
- def __init__(self,devFile):
- DevFile = open(devFile)
- devList = [Device(line) for line in DevFile]
- #etc, etc...
-
- def __deepcopy__(self, memo):
- x = DeviceManager.__new__(DeviceManager)
- memo[id(self)] = x
- for n, v in self.__dict__.iteritems():
- setattr(x, n, copy.deepcopy(v, memo))
- return x
-
-class Device(object):
- def __init__(self,line):
- self.copies = []
- #do something with line here
-
- def __deepcopy__(self, memo):
- x = Device.__new__(Device)
- memo[id(self)] = x
- for n, v in self.__dict__.iteritems():
- setattr(x, n, copy.deepcopy(v, memo))
- return x
-
-DevMan1 = DeviceManager(r'c:\autoexec.bat')
-DevMan2 = copy.deepcopy(DevMan1)
-
-print DevMan1 is DevMan2
 
B

Bernie

That is clever, gives a lot of insight into how the __dict__ == the
object.


This is somewhat like the solution I am using from the Cookbook, an
Empty object copy. This is cleaner and very much more concise.
Thank you!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top