|
3543 | 3543 | " _stateattrs=()\n", |
3544 | 3544 | " def __init__(self,*args,**kwargs):\n", |
3545 | 3545 | " self._init_state()\n", |
3546 | | - " super().__init__(*args,**kwargs)\n", |
| 3546 | + " super().__init__(*args,**kwargs) # required for mixin usage\n", |
3547 | 3547 | " \n", |
3548 | 3548 | " def __getstate__(self):\n", |
3549 | 3549 | " return {k:v for k,v in self.__dict__.items()\n", |
|
3554 | 3554 | " self._init_state()\n", |
3555 | 3555 | "\n", |
3556 | 3556 | " def _init_state(self):\n", |
3557 | | - " \"Override for custom deserialization logic\"\n", |
| 3557 | + " \"Override for custom init and deserialization logic\"\n", |
3558 | 3558 | " self._state = {}" |
3559 | 3559 | ] |
3560 | 3560 | }, |
|
3604 | 3604 | "test_eq(t2._state,{})" |
3605 | 3605 | ] |
3606 | 3606 | }, |
| 3607 | + { |
| 3608 | + "cell_type": "markdown", |
| 3609 | + "metadata": {}, |
| 3610 | + "source": [ |
| 3611 | + "Override `_init_state` to do any necessary setup steps that are required during `__init__` or during deserialization (e.g. `pickle.load`). Here's an example of how `Stateful` simplifies the official Python example for [Handling Stateful Objects](https://docs.python.org/3/library/pickle.html#handling-stateful-objects)." |
| 3612 | + ] |
| 3613 | + }, |
| 3614 | + { |
| 3615 | + "cell_type": "code", |
| 3616 | + "execution_count": null, |
| 3617 | + "metadata": {}, |
| 3618 | + "outputs": [], |
| 3619 | + "source": [ |
| 3620 | + "class TextReader(Stateful):\n", |
| 3621 | + " \"\"\"Print and number lines in a text file.\"\"\"\n", |
| 3622 | + " _stateattrs=('file',)\n", |
| 3623 | + " def __init__(self, filename):\n", |
| 3624 | + " self.filename,self.lineno = filename,0\n", |
| 3625 | + " super().__init__()\n", |
| 3626 | + "\n", |
| 3627 | + " def readline(self):\n", |
| 3628 | + " self.lineno += 1\n", |
| 3629 | + " line = self.file.readline()\n", |
| 3630 | + " if line: return f\"{self.lineno}: {line.strip()}\"\n", |
| 3631 | + "\n", |
| 3632 | + " def _init_state(self):\n", |
| 3633 | + " self.file = open(self.filename)\n", |
| 3634 | + " for _ in range(self.lineno): self.file.readline()" |
| 3635 | + ] |
| 3636 | + }, |
| 3637 | + { |
| 3638 | + "cell_type": "code", |
| 3639 | + "execution_count": null, |
| 3640 | + "metadata": {}, |
| 3641 | + "outputs": [ |
| 3642 | + { |
| 3643 | + "name": "stdout", |
| 3644 | + "output_type": "stream", |
| 3645 | + "text": [ |
| 3646 | + "1: {\n", |
| 3647 | + "2: \"cells\": [\n", |
| 3648 | + "3: {\n" |
| 3649 | + ] |
| 3650 | + } |
| 3651 | + ], |
| 3652 | + "source": [ |
| 3653 | + "reader = TextReader(\"00_test.ipynb\")\n", |
| 3654 | + "print(reader.readline())\n", |
| 3655 | + "print(reader.readline())\n", |
| 3656 | + "\n", |
| 3657 | + "new_reader = pickle.loads(pickle.dumps(reader))\n", |
| 3658 | + "print(reader.readline())" |
| 3659 | + ] |
| 3660 | + }, |
3607 | 3661 | { |
3608 | 3662 | "cell_type": "code", |
3609 | 3663 | "execution_count": null, |
|
0 commit comments