diff --git a/psyneulink/core/components/component.py b/psyneulink/core/components/component.py index 5c2f4175016..13756416e48 100644 --- a/psyneulink/core/components/component.py +++ b/psyneulink/core/components/component.py @@ -2167,13 +2167,10 @@ def _initialize_parameters(self, context=None, **param_defaults): alias_names = {p.name for p in self.class_parameters if isinstance(p, ParameterAlias)} self.parameters = self.Parameters(owner=self, parent=self.class_parameters) + self.defaults = Defaults(owner=self, parent=self.class_defaults) # assign defaults based on pass in params and class defaults - defaults = { - k: v for (k, v) in self.class_defaults.values(show_all=True).items() - if k not in alias_names - } - + defaults = {} if param_defaults is not None: for name, value in copy.copy(param_defaults).items(): if name in alias_names: @@ -2214,13 +2211,14 @@ def _initialize_parameters(self, context=None, **param_defaults): for k in defaults: if defaults[k] is None: continue - defaults[k] = copy_parameter_value( - defaults[k], - shared_types=shared_types + setattr( + self.defaults, k, + copy_parameter_value( + defaults[k], + shared_types=shared_types + ) ) - self.defaults = Defaults(owner=self, **defaults) - for p in filter(lambda x: not isinstance(x, (ParameterAlias, SharedParameter)), self.parameters._in_dependency_order): # copy spec so it is not overwritten later # TODO: check if this is necessary diff --git a/psyneulink/core/globals/parameters.py b/psyneulink/core/globals/parameters.py index 49d8fd9c11a..ed776573685 100644 --- a/psyneulink/core/globals/parameters.py +++ b/psyneulink/core/globals/parameters.py @@ -978,7 +978,7 @@ def __init__( reference=False, dependencies=None, initializer=None, - port=None, + port=None, # if modulated, set to the ParameterPort mdf_name=None, specify_none=False, _owner=None, @@ -988,7 +988,6 @@ def __init__( # attributes will be taken from _inherited_source=None, _user_specified=False, - # if modulated, set to the ParameterPort **kwargs ): if isinstance(aliases, str): @@ -1246,7 +1245,7 @@ def _restore_inherited_attrs(self, exclusions=None): attr not in exclusions and getattr(self, attr) is getattr(self._parent, attr) ): - setattr(self, attr, self._inherited_attrs_cache[attr]) + super().__setattr__(attr, self._inherited_attrs_cache[attr]) @property def _parent(self): @@ -1726,9 +1725,10 @@ def _initialize_from_context(self, context=None, base_context=Context(execution_ # KDM 7/30/18: the below is weird like this in order to use this like a property, but also include it # in the interface for user simplicity: that is, inheritable (by this Parameter's children or from its parent), # visible in a Parameter's repr, and easily settable by the user - def _set_default_value(self, value): - value = self._parse(value) - self._validate(value) + def _set_default_value(self, value, directly=False): + if not directly: + value = self._parse(value) + self._validate(value) super().__setattr__('default_value', value) @@ -2174,8 +2174,11 @@ def __setattr__(self, attr, value): super().__setattr__(attr, value) else: if isinstance(value, Parameter): + is_new_parameter = False + if value._owner is None: value._owner = self + is_new_parameter = True elif value._owner is not self and self._initializing: # case where no Parameters class defined on subclass # but default value overridden in __init__ @@ -2186,7 +2189,8 @@ def __setattr__(self, attr, value): value.name = attr if self._initializing and not value._inherited: - value.default_value = self._reconcile_value_with_init_default(attr, value.default_value) + reconciled_value = self._reconcile_value_with_init_default(attr, value.default_value) + value._set_default_value(reconciled_value, directly=not is_new_parameter) super().__setattr__(attr, value)