An alternative to @dataclass is to use pyfields. It provides validation and conversion out of the box, and is directly done at the field level so you can use fields inside any class, without modifying them in any way.
from pyfields import field, init_fields
from valid8.validation_lib import is_in
ALLOWED_COLORS = ('blue', 'yellow', 'brown')
class Car(object):
    """ My class with many fields """
    color: str = field(check_type=True, validators=is_in(ALLOWED_COLORS))
    name: str = field(check_type=True, validators={'should be non-empty': lambda s: len(s) > 0})
    wheels: int = field(check_type=True, validators={'should be positive': lambda x: x > 0})
    @init_fields
    def __init__(self, msg="hello world!"):
        print(msg)
c = Car(color='blue', name='roadie', wheels=3)
c.wheels = 'hello'   # <-- (1) type validation error, see below
c.wheels = 0         # <-- (2) value validation error, see below
yields the following two errors
TypeError: Invalid value type provided for '<...>.Car.wheels'. 
   Value should be of type <class 'int'>. Instead, received a 'str': 'hello'
and
valid8.entry_points.ValidationError[ValueError]: 
   Error validating [<...>.Car.wheels=0]. 
   InvalidValue: should be positive. 
   Function [<lambda>] returned [False] for value 0.
See pyfields documentation for details. I'm the author by the way :)