|
3531 | 3531 | "## Other Helpers" |
3532 | 3532 | ] |
3533 | 3533 | }, |
| 3534 | + { |
| 3535 | + "cell_type": "code", |
| 3536 | + "execution_count": null, |
| 3537 | + "metadata": {}, |
| 3538 | + "outputs": [], |
| 3539 | + "source": [ |
| 3540 | + "#export\n", |
| 3541 | + "class Stateful:\n", |
| 3542 | + " \"A base class/mixin for objects that should not serialize all their state\"\n", |
| 3543 | + " _stateattrs=()\n", |
| 3544 | + " def __init__(self,*args,**kwargs):\n", |
| 3545 | + " self._init_state()\n", |
| 3546 | + " super().__init__(*args,**kwargs)\n", |
| 3547 | + " \n", |
| 3548 | + " def __getstate__(self):\n", |
| 3549 | + " return {k:v for k,v in self.__dict__.items()\n", |
| 3550 | + " if k not in self._stateattrs+('_state',)}\n", |
| 3551 | + " \n", |
| 3552 | + " def __setstate__(self, state):\n", |
| 3553 | + " self.__dict__.update(state)\n", |
| 3554 | + " self._init_state()\n", |
| 3555 | + "\n", |
| 3556 | + " def _init_state(self):\n", |
| 3557 | + " \"Override for custom deserialization logic\"\n", |
| 3558 | + " self._state = {}" |
| 3559 | + ] |
| 3560 | + }, |
| 3561 | + { |
| 3562 | + "cell_type": "code", |
| 3563 | + "execution_count": null, |
| 3564 | + "metadata": {}, |
| 3565 | + "outputs": [ |
| 3566 | + { |
| 3567 | + "data": { |
| 3568 | + "text/markdown": [ |
| 3569 | + "<h4 id=\"Stateful\" class=\"doc_header\"><code>class</code> <code>Stateful</code><a href=\"\" class=\"source_link\" style=\"float:right\">[source]</a></h4>\n", |
| 3570 | + "\n", |
| 3571 | + "> <code>Stateful</code>(**\\*`args`**, **\\*\\*`kwargs`**)\n", |
| 3572 | + "\n", |
| 3573 | + "A base class/mixin for objects that should not serialize all their state" |
| 3574 | + ], |
| 3575 | + "text/plain": [ |
| 3576 | + "<IPython.core.display.Markdown object>" |
| 3577 | + ] |
| 3578 | + }, |
| 3579 | + "metadata": {}, |
| 3580 | + "output_type": "display_data" |
| 3581 | + } |
| 3582 | + ], |
| 3583 | + "source": [ |
| 3584 | + "show_doc(Stateful, title_level=4)" |
| 3585 | + ] |
| 3586 | + }, |
| 3587 | + { |
| 3588 | + "cell_type": "code", |
| 3589 | + "execution_count": null, |
| 3590 | + "metadata": {}, |
| 3591 | + "outputs": [], |
| 3592 | + "source": [ |
| 3593 | + "class _T(Stateful):\n", |
| 3594 | + " def __init__(self):\n", |
| 3595 | + " super().__init__()\n", |
| 3596 | + " self.a=1\n", |
| 3597 | + " self._state['test']=2\n", |
| 3598 | + "\n", |
| 3599 | + "t = _T()\n", |
| 3600 | + "t2 = pickle.loads(pickle.dumps(t))\n", |
| 3601 | + "test_eq(t.a,1)\n", |
| 3602 | + "test_eq(t._state['test'],2)\n", |
| 3603 | + "test_eq(t2.a,1)\n", |
| 3604 | + "test_eq(t2._state,{})" |
| 3605 | + ] |
| 3606 | + }, |
3534 | 3607 | { |
3535 | 3608 | "cell_type": "code", |
3536 | 3609 | "execution_count": null, |
|
0 commit comments