es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La clase de datos (Dataclass) evita que el atributo sea cambiado.

Estoy utilizando Python 3.10, así que tengo una dataclass de Python.

@dataclass(frozen=True, slots=True)
class Card:
    COLORS = ["Rojo", "Verde", "Amarillo", "Azul"]
    CARD = ["3"]
    card: int
    color: int = None

Entonces, ahora si creo un objeto e intento cambiar su atributo usando object.__setattr__ o object.attribute = value, obtengo un error, lo cual está bien.

Pero cuando hago

Card.CARD = ["2"]

Se ejecuta correctamente sin generar un error, lo cual no quiero. Quiero que arroje un error.

Al igual que si intento:

>>> int.a = "9"

Obtengo un TypeError.

TypeError: no se puede establecer el atributo 'a' en un tipo inmutable 'int'

¿Qué debo hacer para que cuando haga Card.CARD = ["2"] obtenga un error que diga:

TypeError: no se puede establecer el atributo 'CARD' en un tipo inmutable 'Card'
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar la modificación del atributo CARD de la clase Card, puedes marcarlo como una variable de clase al declararlo dentro del bloque de la clase pero fuera del método constructor __init__, y luego marcarlo como frozen=True en el decorador dataclass. Esto lo convertirá en un valor inmutable a nivel de clase, impidiendo cualquier modificación después de haber sido definido.

    Así es como se vería el código modificado:

    from dataclasses import dataclass
    
    @dataclass(frozen=True, slots=True)
    class Card:
        COLORS = ["Rojo", "Verde", "Amarillo", "Azul"]
        CARD: list[str] = ["3"]  # Marcado como variable de clase e inmutable
        card: int
        color: int = None
    

    Ahora, intentar modificar el atributo CARD generará un TypeError:

    Card.CARD = ["2"]  # Genera TypeError: no se puede asignar al campo 'CARD' de la clase congelada 'Card'
    

    De esta manera, el atributo CARD permanecerá inmutable una vez que haya sido definido, y cualquier intento de modificarlo será capturado por el intérprete.

Comments are closed.