Python __add__ e __iadd__: copia o mutación en lugar

Python __add__ e __iadd__: copia o mutación en lugar

__add__ e __iadd__ definen dos comportamientos distintos para la adición en Python: uno crea un nuevo objeto, el otro modifica el existente. Esta distinción tiene consecuencias reales sobre los alias y las referencias compartidas, y sorprende incluso a desarrolladores experimentados. add: la adición que crea __add__ es invocada por el operador +. Debe retornar un nuevo objeto y dejar los operandos sin cambios. class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) a = Vector(1, 2) b = Vector(3, 4) c = a + b # nuevo Vector(4, 6) print(a.x, a.y) # 1 2 — a no cambia print(id(a) == id(c)) # False — objetos distintos a + b llama a a.__add__(b). Si __add__ no está definido en a o retorna NotImplemented, Python intenta b.__radd__(a). ...

15 de mayo de 2026 · 4 min · Anthony
Python @property: de la encapsulación a los descriptores

Python @property: de la encapsulación a los descriptores

Acceder a r.width y escribir r.width = 15 con la misma sintaxis que un atributo normal, mientras se ejecuta validación o cálculo por debajo: eso es lo que @property aporta. Y cuando esa lógica necesita compartirse entre varias clases, los descriptores entran en juego. @property: getters y setters sin fricción @property permite exponer un atributo calculado o validado con la misma sintaxis que un atributo simple. class Rectangle: def __init__(self, width: float, height: float): self._width = width self._height = height @property def width(self) -> float: return self._width @width.setter def width(self, value: float) -> None: if value <= 0: raise ValueError("El ancho debe ser positivo.") self._width = value @property def area(self) -> float: return self._width * self._height El beneficio concreto: la API pública no cambia. Añadir validación a un atributo existente no rompe ningún código llamador. @property sin setter crea un atributo de solo lectura. @nombre.deleter gestiona la eliminación con del. ...

12 de mayo de 2026 · 3 min · Anthony
Connascencia Python: 9 tipos de acoplamiento explicados

Connascencia Python: 9 tipos de acoplamiento explicados

El acoplamiento se trata a menudo como una noción vaga: “está demasiado acoplado” no dice nada sobre qué cambiar concretamente. La connascencia proporciona un vocabulario preciso para nombrar las diferentes formas de acoplamiento, compararlas y decidir cuáles reducir primero. El concepto está documentado en detalle en connascence.io. Tres ejes para evaluar la connascencia Cada instancia de connascencia se analiza según tres ejes: Fuerza: cuanto más fuerte es la connascencia, más difícil es detectarla y refactorizarla. Grado: una entidad acoplada a cientos de otras es más problemática que una acoplada a dos. Localidad: dos componentes cercanos (misma clase, mismo módulo) pueden tolerar formas más fuertes. A distancia, esas mismas formas se vuelven peligrosas. Los 9 tipos de connascencia Connascencia de Nombre (CoN) Varios componentes se ponen de acuerdo sobre el nombre de una entidad. Es la forma más débil e inevitable. ...

11 de mayo de 2026 · 4 min · Anthony

Newsletter

Recibe los nuevos artículos directamente en tu bandeja de entrada.

Sin spam. Baja en un clic.