Why can't you just have self._name, self._shape, etc.? Because having self._data makes the serialization easier? Having self.data may be confusing, if self._name etc exists. Does this (self._data) need to be a member at all, or can it just be returned?