diff --git a/pykat/commands.py b/pykat/commands.py index 772c0039220a6707e99c98929ff3ecfac783bff8..e065c57197317708750d1a0da15fa654611333f2 100644 --- a/pykat/commands.py +++ b/pykat/commands.py @@ -43,31 +43,25 @@ class Command(object): When deep copying a kat object we need to take into account the instance specific properties. """ - cls = self.__class__ result = cls.__new__(cls) + result._unfreeze() result.__dict__ = copy.deepcopy(self.__dict__, memo) for _ in result._putters: _._updateOwner(result) - + + result._freeze() return result def _freeze(self): self.__dict__["____FROZEN____"] = True def _unfreeze(self): self.__dict__["____FROZEN____"] = False def __setattr__(self, name, value): - if self.__dict__["____FROZEN____"] and not hasattr(self, name): + if "____FROZEN____" in self.__dict__ and self.__dict__["____FROZEN____"] and not hasattr(self, name): warnings.warn("'%s' does not have attribute called '%s'" % (self.__name, name), stacklevel=2) - - if hasattr(self, name) and hasattr(self.__class__, name): - prop = getattr(self.__class__, name) - - if isinstance(prop, property): - prop.fset(self, value) - return - - self.__dict__[name] = value + + super(Command, self).__setattr__(name, value) def getFinesseText(self): """ Base class for individual finesse optical components """ diff --git a/pykat/components.py b/pykat/components.py index 4c0f953e467f1b0b434c0b0f75e5ebeb16faebf4..9d014d3b139af67575fe56159408d6183ed33229 100644 --- a/pykat/components.py +++ b/pykat/components.py @@ -100,7 +100,8 @@ class Component(object): cnew = type(cnew_name, (cls,), {}) - return object.__new__(cnew) + o = object.__new__(cnew) + return o def __init__(self, name=None): self._unfreeze() @@ -125,32 +126,26 @@ class Component(object): def _unfreeze(self): self.__dict__["____FROZEN____"] = False def __setattr__(self, name, value): - if self.__dict__["____FROZEN____"] and not hasattr(self, name): + if "____FROZEN____" in self.__dict__ and self.__dict__["____FROZEN____"] and not hasattr(self, name): warnings.warn("'%s' does not have attribute called '%s'" % (self.__name, name), stacklevel=2) - - if hasattr(self, name) and hasattr(self.__class__, name): - prop = getattr(self.__class__, name) - - if isinstance(prop, property): - prop.fset(self, value) - return - - self.__dict__[name] = value + + super(Component, self).__setattr__(name, value) def __deepcopy__(self, memo): """ When deep copying a kat object we need to take into account the instance specific properties. """ - # Here we create a copy of this object based of the base class # of this one, otherwise we're making a copy of a copy of a copy... result = self.__class__.__new__(self.__class__.__base__) + result._unfreeze() result.__dict__ = copy.deepcopy(self.__dict__, memo) for _ in result._params: _._updateOwner(result) - + + result._freeze() return result def _register_param(self, param): diff --git a/pykat/detectors.py b/pykat/detectors.py index a957cd6f14749e82d5d86e11a922401c300a62b8..02580009474fa929d2cc31dc36bf52ff8a9757bf 100644 --- a/pykat/detectors.py +++ b/pykat/detectors.py @@ -51,11 +51,12 @@ class BaseDetector(object) : cnew = type(cnew_name, (cls,), {}) - return object.__new__(cnew) + o = object.__new__(cnew) + return o def __init__(self, name, nodes=None, max_nodes=1): - self.__dict__["____FROZEN____"] = False + self._unfreeze() self.__name = name self._svgItem = None @@ -103,17 +104,10 @@ class BaseDetector(object) : def _unfreeze(self): self.__dict__["____FROZEN____"] = False def __setattr__(self, name, value): - if self.__dict__["____FROZEN____"] and not hasattr(self, name): + if "____FROZEN____" in self.__dict__ and self.__dict__["____FROZEN____"] and not hasattr(self, name): warnings.warn("'%s' does not have attribute called '%s'" % (self.__name, name), stacklevel=2) - - if hasattr(self, name) and hasattr(self.__class__, name): - prop = getattr(self.__class__, name) - - if isinstance(prop, property): - prop.fset(self, value) - return - - self.__dict__[name] = value + + super(BaseDetector, self).__setattr__(name, value) def __deepcopy__(self, memo): """ @@ -124,8 +118,10 @@ class BaseDetector(object) : # Here we create a copy of this object based of the base class # of this one, otherwise we're making a copy of a copy of a copy... result = self.__class__.__new__(self.__class__.__base__) + result._unfreeze() result.__dict__ = copy.deepcopy(self.__dict__, memo) + result._freeze() return result def _register_param(self, param):