Una f-string evalúa la expresión entre llaves y mete el resultado en el texto. Es más rápida que % y .format(), y se lee en el orden en que piensas.
Cada operador, cada función incorporada y cada pieza de sintaxis en Python es una pregunta que se le hace a tu objeto. El modelo de datos es la lista de preguntas.
__slots__ elimina el diccionario por instancia. Ahorra memoria de verdad a gran escala, atrapa errores de tipeo gratis, y es una mala opción por defecto.
El duck typing falla en el lugar de la llamada, mucho después del error. Las ABCs y los Protocols arreglan eso, en direcciones opuestas.
asdict() convierte una dataclass en un diccionario y baja recursivamente hasta el fondo, copiando por el camino. Normalmente es lo que quieres, y de vez en cuando es exactamente lo que no.
Cuatro formas de guardar datos estructurados en Python. La pregunta que decide no es de estilo: es si un error de tipeo debería fallar en voz alta.
Cada operador y cada función incorporada de Python le está haciendo una pregunta a tu objeto. Contéstala y tu clase se comporta como un tipo nativo.
La herencia le da a una subclase todo, incluso lo que no debería tener. El problema del pingüino, y qué hacer en su lugar.
La pregunta siempre es solo qué necesita el método: esta instancia, la clase, o ninguna de las dos. Equivocarse rompe las subclases sin avisar.
Python no necesita getters ni setters, porque @property te deja agregar validación después sin cambiar ni una sola llamada.