docs: def _setup_params(self_,**params):
          """
          Initialize default and keyword parameter values.
  
          First, ensures that all Parameters with 'instantiate=True'
          (typically used for mutable Parameters) are copied directly
          into each object, to ensure that there is an independent copy
          (to avoid suprising aliasing errors).  Then sets each of the
          keyword arguments, warning when any of them are not defined as
          parameters.
  
          Constant Parameters can be set during calls to this method.
          """
          self = self_.param.self
          ## Deepcopy all 'instantiate=True' parameters
          # (build a set of names first to avoid redundantly instantiating
          #  a later-overridden parent class's parameter)
          params_to_instantiate = {}
          for class_ in classlist(type(self)):
              if not issubclass(class_, Parameterized):
                  continue
              for (k,v) in class_.__dict__.items():
                  # (avoid replacing name with the default of None)
                  if isinstance(v,Parameter) and v.instantiate and k!="name":
                      params_to_instantiate[k]=v
  
          for p in params_to_instantiate.values():
              self.param._instantiate_param(p)
  
          ## keyword arg setting
          for name,val in params.items():
              desc = self.__class__.get_param_descriptor(name)[0] # pylint: disable-msg=E1101
              if not desc:
                  self.param.warning("Setting non-parameter attribute %s=%s using a mechanism intended only for parameters",name,val)
              # i.e. if not desc it's setting an attribute in __dict__, not a Parameter
              setattr(self,name,val)