def __setattr__(self, identifier, val):
        # Getattr is skipped for root and first set of children
        shallow = (self.parent is None or self.parent.parent is None)
        if identifier[0].isupper() and self.fixed and shallow:
            raise AttributeError(self._fixed_error % identifier)

        super(AttrTree, self).__setattr__(identifier, val)

        if identifier[0].isupper():
            if not identifier in self.children:
                self.children.append(identifier)
            self._propagate((identifier,), val)
dataset/ETHPy150Open ioam/holoviews/holoviews/core/tree.py/AttrTree.__setattr__/original