---
# System prepended metadata

title: Python Dataclasses.
tags: [DAM]

---

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