--- title: Python Dataclasses. tags: DAM --- <div style="width: 30%; margin-left: auto;"> ![](https://hackmd.io/_uploads/HJiR4eGJT.png) </div> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Llicència de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />Aquesta obra està subjecta a una llicència de <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Reconeixement-CompartirIgual 4.0 Internacional de Creative Commons</a> ![imagen](https://hackmd.io/_uploads/ByzPXJ8TT.png "copiada de: https://medium.com/capital-fund-management/python-dataclasses-6d7a2e1d23db") # Python DataClasses. Les DataClasses són una novetat a partir de python 3.7. Les podem definir com a classes que típicament no tenen més que propietats (dades), però a la pràctica no tenen restriccions. Es creen utilitzan el decorador @dataclass. ```python= from dataclasses import dataclass @dataclass class Alumne: idalu: str nom: str ``` A més de l'estalvi a l'hora d'escriure el codi, les dataclasses es poden comparar atenen a les propietats i s'imprimeixen diferent que les classes normals. Les dataclasses ens obliguen a definir el tipus de les propietats, però sempre li podem assignar el tipus 'Any' si volem un tipat dinàmic. ```python= from dataclasses import dataclass from typing import Any @dataclass class Alumne: idalu: Any nom: Any ``` ## DataClasses immutables. Una característica interessant de les data classes és que les podem definir com a immutables passant-li el paràmetre frozen=True al decorador. ```python= from dataclasses import dataclass @dataclass(frozen=True) class Position: name: str lon: float = 0.0 lat: float = 0.0 p = Position("Barcelona", 2.159, 41.39) p.lat = 3.56 ``` Aquest codi faria saltar una excepció del tipus 'FrozenInstanceError': ```bash= Traceback (most recent call last): File XXXX p.lat = 3.56 ^^^^^ File "<string>", line 4, in __setattr__ dataclasses.FrozenInstanceError: cannot assign to field 'lat' ```