From 5491ccc297cef1efd34cd1bab6d3b69dc27c7936 Mon Sep 17 00:00:00 2001 From: hifly81 Date: Mon, 24 Nov 2025 12:45:50 +0100 Subject: [PATCH] added decorator dataclass --- 11_decorator_closure.ipynb | 81 ++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 7 deletions(-) diff --git a/11_decorator_closure.ipynb b/11_decorator_closure.ipynb index 44730b7..fd5efad 100755 --- a/11_decorator_closure.ipynb +++ b/11_decorator_closure.ipynb @@ -194,7 +194,7 @@ "greet()" ] }, - { +{ "cell_type": "markdown", "metadata": {}, "source": [ @@ -205,10 +205,25 @@ "- `@classmethod`\n", "- `@property`\n", "\n", - "Qui vengono mostrati alcuni esempi:" + "#### `@staticmethod`\n", + "- Trasforma un metodo in una funzione \"normale\" contenuta nella classe.\n", + "- Non riceve automaticamente `self` (istanza) o `cls` (classe).\n", + "- Utile per funzioni di utilità legate logicamente alla classe ma che non usano i dati della classe.\n", + "\n", + "#### `@classmethod`\n", + "- Definisce un metodo che riceve la **classe** come primo argomento, chiamato `cls`.\n", + "- Utile per creare metodi costruttori alternativi o lavorare su dati di classe.\n", + "- Funziona correttamente anche con le classi derivate.\n", + "\n", + "#### `@property`\n", + "- Permette di definire attributi controllati: si accede a un metodo come se fosse una variabile.\n", + "- Migliora l'incapsulamento senza cambiare l'interfaccia dell'oggetto.\n", + "- Può avere un getter, un setter (`@.setter`) e un deleter (`@.deleter`).\n", + "\n", + "### Esempio:" ] - }, - { +}, +{ "cell_type": "code", "execution_count": null, "metadata": {}, @@ -237,12 +252,64 @@ " return cls(1)\n", "\n", "c = Circle(5)\n", - "print(c.radius)\n", + "print('Initial radius:', c.radius)\n", + "\n", + "# setter usage\n", + "c.radius = 10\n", + "print('Updated radius:', c.radius)\n", + "\n", + "# isntance method usage\n", "Circle.info()\n", + "\n", + "# classmethod usage\n", "unit = Circle.unit_circle()\n", - "print(unit.radius)" + "print('Unit circle radius:', unit.radius)\n" ] - }, +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🧩 `@dataclass`: decorator per creare classi \"automatiche\"\n", + "\n", + "Il decorator `@dataclass`, introdotto in Python 3.7, permette di generare automaticamente diversi metodi di una classe, come:\n", + "- `__init__`\n", + "- `__repr__`\n", + "- `__eq__`\n", + "- (opzionale) metodi di confronto: `<`, `<=`, `>`\n", + "\n", + "È utile per rappresentare strutture dati senza dover scrivere molto codice boilerplate.\n", + "\n", + "Basta applicare `@dataclass` sopra la classe e definire gli attributi come variabili di classe.\n", + "\n", + "Si può configurare con parametri come:\n", + "- `frozen=True` → crea oggetti immutabili\n", + "- `order=True` → abilita i confronti (`<`, `>=`, ...)\n", + "- `default` / `default_factory` → valori di default\n", + "\n", + "### Esempio:" + ] +}, +{ + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "\n", + "@dataclass\n", + "class Point:\n", + " x: float\n", + " y: float\n", + "\n", + "p1 = Point(3, 4)\n", + "p2 = Point(3, 4)\n", + "\n", + "print('Point:', p1) # __repr__\n", + "print('Are equal?', p1 == p2) # __eq__\n" + ] +}, { "cell_type": "markdown", "metadata": {},