CRITERIO

Lección 14 de 16 · dataclass(frozen=True) y operadores

Value Object: valores que no cambian

Ver que a + b llama a un método, que el Value Object crea objetos nuevos y que == compara por valor.

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16

t<0 Antes de ejecutar

Lee el código y comprométete con una predicción

Mientras tanto, Python ya hizo su parte de t<0: leyó y compiló el archivo completo. Ninguna variable existe todavía.

programa.py

1from dataclasses import dataclass
2
3@dataclass(frozen=True)
4class Monto:
5    valor: int
6    moneda: str
7
8    def __add__(self, otro):
9        if self.moneda != otro.moneda:
10            raise ValueError("Monedas distintas")
11        return Monto(self.valor + otro.valor, self.moneda)
12
13a = Monto(10, "PEN")
14b = Monto(5, "PEN")
15total = a + b
16print(total)
17print(a == Monto(10, "PEN"))
¿Qué ejecuta Python en total = a + b?

t=0 t>0 Ejecución paso a paso

Qué se ejecuta primero y dónde vive cada variable

Avanza con Siguiente paso o las flechas del teclado. Pasa el mouse por una variable para ver a qué objeto apunta.

t=-1

Antes de ejecutar

Python lee y compila el archivo

programa.pyrecién ejecutadasiguiente
1from dataclasses import dataclass2 3@dataclass(frozen=True)4class Monto:5    valor: int6    moneda: str7 8    def __add__(self, otro):9        if self.moneda != otro.moneda:10            raise ValueError("Monedas distintas")11        return Monto(self.valor + otro.valor, self.moneda)12 13a = Monto(10, "PEN")14b = Monto(5, "PEN")15total = a + b16print(total)17print(a == Monto(10, "PEN"))

Salida

(vacía)

Qué pasó

  • Antes de ejecutar nada, Python lee el archivo completo y lo compila a bytecode: instrucciones que su máquina virtual entiende.
  • Si hubiera un error de sintaxis, el programa fallaría aquí, sin ejecutar ni una sola línea.
  • Nombres que aparecen en el código: Monto, ValueError, a, b, dataclass, dataclasses, moneda, otro, print, self, total, valor. Ninguno existe todavía en memoria.

Pila de marcos · dónde viven los nombres

Todavía no hay marcos: ninguna variable existe.

Montón · dónde viven los objetos

Ningún objeto todavía.

Idea clave

a + b no suma números: llama a a.__add__(b), que verifica la moneda y crea un Monto nuevo. a y b no cambian nunca (frozen). Dos Monto con los mismos valores son iguales aunque vivan en direcciones distintas.

t>0 Después: repaso sin mirar

Recupera de memoria

Responde sin volver al paso a paso. Para dominar la lección necesitas 2 de 2.

Después de total = a + b, ¿cambió a?
¿Por qué a == Monto(10, "PEN") da True si son objetos distintos?

Explícalo con tus palabras (Feynman)

Dominio de la lección

Aún no

  • Falta la predicción (t<0)
  • Repaso: 0 de 2 (se necesitan 2)