|
1 | 1 | {
|
2 | 2 | "cells": [
|
3 |
| - { |
4 |
| - "cell_type": "markdown", |
5 |
| - "metadata": {}, |
6 |
| - "source": [ |
7 |
| - "# Avoiding class hierarchies" |
8 |
| - ] |
9 |
| - }, |
10 | 3 | {
|
11 | 4 | "cell_type": "markdown",
|
12 | 5 | "metadata": {},
|
|
23 | 16 | },
|
24 | 17 | {
|
25 | 18 | "cell_type": "code",
|
26 |
| - "execution_count": 37, |
| 19 | + "execution_count": 1, |
27 | 20 | "metadata": {},
|
28 | 21 | "outputs": [],
|
29 | 22 | "source": [
|
|
34 | 27 | "cell_type": "markdown",
|
35 | 28 | "metadata": {},
|
36 | 29 | "source": [
|
37 |
| - "## Duck typing" |
| 30 | + "# Duck typing" |
38 | 31 | ]
|
39 | 32 | },
|
40 | 33 | {
|
|
53 | 46 | },
|
54 | 47 | {
|
55 | 48 | "cell_type": "code",
|
56 |
| - "execution_count": 47, |
| 49 | + "execution_count": 2, |
57 | 50 | "metadata": {},
|
58 | 51 | "outputs": [],
|
59 | 52 | "source": [
|
|
71 | 64 | },
|
72 | 65 | {
|
73 | 66 | "cell_type": "code",
|
74 |
| - "execution_count": 48, |
| 67 | + "execution_count": 3, |
75 | 68 | "metadata": {},
|
76 | 69 | "outputs": [],
|
77 | 70 | "source": [
|
|
96 | 89 | },
|
97 | 90 | {
|
98 | 91 | "cell_type": "code",
|
99 |
| - "execution_count": 49, |
| 92 | + "execution_count": 4, |
100 | 93 | "metadata": {},
|
101 | 94 | "outputs": [],
|
102 | 95 | "source": [
|
|
112 | 105 | },
|
113 | 106 | {
|
114 | 107 | "cell_type": "code",
|
115 |
| - "execution_count": 50, |
| 108 | + "execution_count": 5, |
116 | 109 | "metadata": {},
|
117 | 110 | "outputs": [
|
118 | 111 | {
|
|
140 | 133 | "cell_type": "markdown",
|
141 | 134 | "metadata": {},
|
142 | 135 | "source": [
|
143 |
| - "An alternative way to implement this, and to avoid " |
144 |
| - ] |
145 |
| - }, |
146 |
| - { |
147 |
| - "cell_type": "markdown", |
148 |
| - "metadata": {}, |
149 |
| - "source": [ |
150 |
| - "## Mix-in" |
| 136 | + "# Mix-in" |
151 | 137 | ]
|
152 | 138 | },
|
153 | 139 | {
|
|
159 | 145 | },
|
160 | 146 | {
|
161 | 147 | "cell_type": "code",
|
162 |
| - "execution_count": 52, |
| 148 | + "execution_count": 6, |
163 | 149 | "metadata": {},
|
164 | 150 | "outputs": [],
|
165 | 151 | "source": [
|
|
176 | 162 | "cell_type": "markdown",
|
177 | 163 | "metadata": {},
|
178 | 164 | "source": [
|
179 |
| - "The `Duck` and `Timer` classes now inherit from `SoundMaker`, but" |
| 165 | + "The `Duck`, `Timer` and `Dog` classes now inherit from `SoundMaker`, but `Dog` doesn't define its sound attribute." |
180 | 166 | ]
|
181 | 167 | },
|
182 | 168 | {
|
183 | 169 | "cell_type": "code",
|
184 |
| - "execution_count": 54, |
| 170 | + "execution_count": 7, |
185 | 171 | "metadata": {},
|
186 | 172 | "outputs": [],
|
187 | 173 | "source": [
|
|
196 | 182 | },
|
197 | 183 | {
|
198 | 184 | "cell_type": "code",
|
199 |
| - "execution_count": 55, |
| 185 | + "execution_count": 8, |
200 | 186 | "metadata": {},
|
201 | 187 | "outputs": [],
|
202 | 188 | "source": [
|
|
211 | 197 | },
|
212 | 198 | {
|
213 | 199 | "cell_type": "code",
|
214 |
| - "execution_count": 56, |
| 200 | + "execution_count": 9, |
215 | 201 | "metadata": {},
|
216 | 202 | "outputs": [],
|
217 | 203 | "source": [
|
|
225 | 211 | },
|
226 | 212 | {
|
227 | 213 | "cell_type": "code",
|
228 |
| - "execution_count": 58, |
| 214 | + "execution_count": 10, |
229 | 215 | "metadata": {},
|
230 | 216 | "outputs": [],
|
231 | 217 | "source": [
|
|
234 | 220 | },
|
235 | 221 | {
|
236 | 222 | "cell_type": "code",
|
237 |
| - "execution_count": 59, |
| 223 | + "execution_count": 11, |
238 | 224 | "metadata": {},
|
239 | 225 | "outputs": [
|
240 | 226 | {
|
|
251 | 237 | " print(f'{type(item)} says {item.make_sound()}')"
|
252 | 238 | ]
|
253 | 239 | },
|
| 240 | + { |
| 241 | + "cell_type": "markdown", |
| 242 | + "metadata": {}, |
| 243 | + "source": [ |
| 244 | + "Since the `Dog` has no `_sound`, the mix-in method raises an exception." |
| 245 | + ] |
| 246 | + }, |
254 | 247 | {
|
255 | 248 | "cell_type": "code",
|
256 |
| - "execution_count": 60, |
| 249 | + "execution_count": 12, |
257 | 250 | "metadata": {},
|
258 | 251 | "outputs": [
|
259 | 252 | {
|
260 | 253 | "name": "stderr",
|
261 | 254 | "output_type": "stream",
|
262 | 255 | "text": [
|
263 | 256 | "Traceback (most recent call last):\n",
|
264 |
| - " File \"<ipython-input-60-1c825f3b7991>\", line 3, in <module>\n", |
| 257 | + " File \"<ipython-input-12-1c825f3b7991>\", line 3, in <module>\n", |
265 | 258 | " print(dog.make_sound())\n",
|
266 |
| - " File \"<ipython-input-52-918cd6c589ba>\", line 7, in make_sound\n", |
| 259 | + " File \"<ipython-input-6-918cd6c589ba>\", line 7, in make_sound\n", |
267 | 260 | " raise ValueError(f'{type(self)} does not make sound')\n",
|
268 | 261 | "ValueError: <class '__main__.Dog'> does not make sound\n"
|
269 | 262 | ]
|
|
294 | 287 | "name": "python",
|
295 | 288 | "nbconvert_exporter": "python",
|
296 | 289 | "pygments_lexer": "ipython3",
|
297 |
| - "version": "3.7.0" |
| 290 | + "version": "3.9.5" |
298 | 291 | }
|
299 | 292 | },
|
300 | 293 | "nbformat": 4,
|
301 |
| - "nbformat_minor": 2 |
| 294 | + "nbformat_minor": 4 |
302 | 295 | }
|
0 commit comments