---
title: Python Dataclasses.
tags: DAM
---
<div style="width: 30%; margin-left: auto;">

</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>

# 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'
```