diff --git a/pykat/components.py b/pykat/components.py index fa2e91503c8a55ace8be17ce009c270095c15354..7931e3a1ce3ef0af153e7e00c82163ea6fc0fd8c 100644 --- a/pykat/components.py +++ b/pykat/components.py @@ -198,7 +198,20 @@ class Component(object): del self._params[:] self.__removed = True - + + def __deepcopy__(self, memo): + cls = self.__class__ + result = cls.__new__(cls) + memo[id(self)] = result + + for k, v in self.__dict__.items(): + setattr(result, k, deepcopy(v, memo)) + + for p in result._params: + p._updateOwner(result) + + return result + class AbstractMirrorComponent(Component): __metaclass__ = abc.ABCMeta diff --git a/pykat/param.py b/pykat/param.py index 31fe7c36839d30d32e0db1946062aa94ceda8d8e..a5bb11dee3400392edea62544d8d6c85cea6c2da 100644 --- a/pykat/param.py +++ b/pykat/param.py @@ -87,6 +87,15 @@ class Param(putable, putter): putter.__init__(self, var_name, isPutter) putable.__init__(self, owner.name, name, isPutable) + + def _updateOwner(self, newOwner): + """ + This updates the internal weak reference to link a parameter to who owns it. + Should only be called by the __deepcopy__ component method to ensure things + are kept up to date. + """ + del self._owner + self._owner = weakref.ref(newOwner) @property def canFsig(self): return self._canFsig