|
194 | 194 | "greet()" |
195 | 195 | ] |
196 | 196 | }, |
197 | | - { |
| 197 | +{ |
198 | 198 | "cell_type": "markdown", |
199 | 199 | "metadata": {}, |
200 | 200 | "source": [ |
|
205 | 205 | "- `@classmethod`\n", |
206 | 206 | "- `@property`\n", |
207 | 207 | "\n", |
208 | | - "Qui vengono mostrati alcuni esempi:" |
| 208 | + "#### `@staticmethod`\n", |
| 209 | + "- Trasforma un metodo in una funzione \"normale\" contenuta nella classe.\n", |
| 210 | + "- Non riceve automaticamente `self` (istanza) o `cls` (classe).\n", |
| 211 | + "- Utile per funzioni di utilità legate logicamente alla classe ma che non usano i dati della classe.\n", |
| 212 | + "\n", |
| 213 | + "#### `@classmethod`\n", |
| 214 | + "- Definisce un metodo che riceve la **classe** come primo argomento, chiamato `cls`.\n", |
| 215 | + "- Utile per creare metodi costruttori alternativi o lavorare su dati di classe.\n", |
| 216 | + "- Funziona correttamente anche con le classi derivate.\n", |
| 217 | + "\n", |
| 218 | + "#### `@property`\n", |
| 219 | + "- Permette di definire attributi controllati: si accede a un metodo come se fosse una variabile.\n", |
| 220 | + "- Migliora l'incapsulamento senza cambiare l'interfaccia dell'oggetto.\n", |
| 221 | + "- Può avere un getter, un setter (`@<nome>.setter`) e un deleter (`@<nome>.deleter`).\n", |
| 222 | + "\n", |
| 223 | + "### Esempio:" |
209 | 224 | ] |
210 | | - }, |
211 | | - { |
| 225 | +}, |
| 226 | +{ |
212 | 227 | "cell_type": "code", |
213 | 228 | "execution_count": null, |
214 | 229 | "metadata": {}, |
|
237 | 252 | " return cls(1)\n", |
238 | 253 | "\n", |
239 | 254 | "c = Circle(5)\n", |
240 | | - "print(c.radius)\n", |
| 255 | + "print('Initial radius:', c.radius)\n", |
| 256 | + "\n", |
| 257 | + "# setter usage\n", |
| 258 | + "c.radius = 10\n", |
| 259 | + "print('Updated radius:', c.radius)\n", |
| 260 | + "\n", |
| 261 | + "# isntance method usage\n", |
241 | 262 | "Circle.info()\n", |
| 263 | + "\n", |
| 264 | + "# classmethod usage\n", |
242 | 265 | "unit = Circle.unit_circle()\n", |
243 | | - "print(unit.radius)" |
| 266 | + "print('Unit circle radius:', unit.radius)\n" |
244 | 267 | ] |
245 | | - }, |
| 268 | +}, |
| 269 | +{ |
| 270 | + "cell_type": "markdown", |
| 271 | + "metadata": {}, |
| 272 | + "source": [ |
| 273 | + "## 🧩 `@dataclass`: decorator per creare classi \"automatiche\"\n", |
| 274 | + "\n", |
| 275 | + "Il decorator `@dataclass`, introdotto in Python 3.7, permette di generare automaticamente diversi metodi di una classe, come:\n", |
| 276 | + "- `__init__`\n", |
| 277 | + "- `__repr__`\n", |
| 278 | + "- `__eq__`\n", |
| 279 | + "- (opzionale) metodi di confronto: `<`, `<=`, `>`\n", |
| 280 | + "\n", |
| 281 | + "È utile per rappresentare strutture dati senza dover scrivere molto codice boilerplate.\n", |
| 282 | + "\n", |
| 283 | + "Basta applicare `@dataclass` sopra la classe e definire gli attributi come variabili di classe.\n", |
| 284 | + "\n", |
| 285 | + "Si può configurare con parametri come:\n", |
| 286 | + "- `frozen=True` → crea oggetti immutabili\n", |
| 287 | + "- `order=True` → abilita i confronti (`<`, `>=`, ...)\n", |
| 288 | + "- `default` / `default_factory` → valori di default\n", |
| 289 | + "\n", |
| 290 | + "### Esempio:" |
| 291 | + ] |
| 292 | +}, |
| 293 | +{ |
| 294 | + "cell_type": "code", |
| 295 | + "execution_count": null, |
| 296 | + "metadata": {}, |
| 297 | + "outputs": [], |
| 298 | + "source": [ |
| 299 | + "from dataclasses import dataclass\n", |
| 300 | + "\n", |
| 301 | + "@dataclass\n", |
| 302 | + "class Point:\n", |
| 303 | + " x: float\n", |
| 304 | + " y: float\n", |
| 305 | + "\n", |
| 306 | + "p1 = Point(3, 4)\n", |
| 307 | + "p2 = Point(3, 4)\n", |
| 308 | + "\n", |
| 309 | + "print('Point:', p1) # __repr__\n", |
| 310 | + "print('Are equal?', p1 == p2) # __eq__\n" |
| 311 | + ] |
| 312 | +}, |
246 | 313 | { |
247 | 314 | "cell_type": "markdown", |
248 | 315 | "metadata": {}, |
|
0 commit comments