def __setstate__(self, state): if _hasattribute(self, '__dict__'): _getattribute(self, '__dict__').clear() for name in self._p_gen_data_slots(): _delattribute(self, name) if state is not None: for key, value in iteritems(state): _setattribute(self, key, value)
def _p_gen_data_slots(self): """Generate the sequence of names of data slots that have values. """ for klass in self.__class__.__mro__: if klass is not PersistentBase: for name in getattr(klass, "__slots__", []): if name not in ("__weakref__", "__dict__") and _hasattribute(self, name): yield name
def __getstate__(self): if self._p_status == GHOST: self._p_load_state() state = {} if _hasattribute(self, '__dict__'): state.update(_getattribute(self, '__dict__')) for name in self._p_gen_data_slots(): state[name] = _getattribute(self, name) return state
def _p_gen_data_slots(self): """Generate the sequence of names of data slots that have values. """ for klass in self.__class__.__mro__: if klass is not PersistentBase: for name in getattr(klass, '__slots__', []): if (name not in ('__weakref__', '__dict__') and _hasattribute(self, name)): yield name
def get(self, compute): """(compute) -> value Compute the value (if necessary) and return it. 'compute' needs to be a function that takes no arguments. """ # we are careful here not to mark object as UNSAVED if _hasattribute(self, 'value'): value = _getattribute(self, 'value') else: value = compute() _setattribute(self, 'value', value) return value