Actualmente estoy probando las nuevas construcciones de clases de datos introducidas en Python 3.7. Actualmente estoy atascado tratando de heredar una clase principal. Parece que el orden de los argumentos está estropeado por mi enfoque actual, de modo que el parámetro bool en la clase secundaria se pasa antes que los otros parámetros. Esto está causando un error de tipo.
from dataclasses import dataclass @dataclass class Parent: name: str age: int ugly: bool = False def print_name(self): print(self.name) def print_age(self): print(self.age) def print_id(self): print(f'The Name is {self.name} and {self.name} is {self.age} year old') @dataclass class Child(Parent): school: str ugly: bool = True jack = Parent('jack snr', 32, ugly=True) jack_son = Child('jack jnr', 12, school = 'havard', ugly=True) jack.print_id() jack_son.print_id() Cuando ejecuto este código obtengo este TypeError :
TypeError: non-default argument 'school' follows default argument¿Cómo puedo solucionar esto?
Puede usar atributos con valores predeterminados en las clases principales si los excluye de la función de inicio. Si necesita la posibilidad de anular el valor predeterminado en init, extienda el código con la respuesta de Praveen Kulkarni.
from dataclasses import dataclass, field @dataclass class Parent: name: str age: int ugly: bool = field(default=False, init=False) @dataclass class Child(Parent): school: str jack = Parent('jack snr', 32) jack_son = Child('jack jnr', 12, school = 'havard') jack_son.ugly = TrueO incluso
@dataclass class Child(Parent): school: str ugly = True # This does not work # ugly: bool = True jack_son = Child('jack jnr', 12, school = 'havard') assert jack_son.uglyTenga en cuenta que con Python 3.10 , ahora es posible hacerlo de forma nativa con clases de datos.
Dataclasses 3.10 agregó el atributo kw_only (similar a attrs). Le permite especificar qué campos son keyword_only, por lo que se establecerán al final de init , sin causar un problema de herencia.
Tomando directamente de la publicación del blog de Eric Smith sobre el tema , hay dos razones por las que las personas solicitaban esta función:
Lo que sigue es la forma más sencilla de hacerlo con este nuevo argumento, pero hay varias formas de usarlo para usar la herencia con valores predeterminados en la clase principal:
from dataclasses import dataclass @dataclass(kw_only=True) class Parent: name: str age: int ugly: bool = False @dataclass(kw_only=True) class Child(Parent): school: str ch = Child(name="Kevin", age=17, school="42") print(ch.ugly)Eche un vistazo a la publicación de blog vinculada anteriormente para obtener una explicación más detallada de kw_only.
Salud !
PD: Como es bastante nuevo, tenga en cuenta que su IDE aún podría generar un posible error, pero funciona en tiempo de ejecución