Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

270
Visualizações
Herencia de clases en las clases de datos de Python 3.7

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?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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 = True

O 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.ugly
over 4 years ago · Santiago Trujillo Relatório

0

Tenga 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:

  • Cuando una clase de datos tiene muchos campos, especificarlos por posición puede volverse ilegible. También requiere que para la compatibilidad con versiones anteriores, todos los campos nuevos se agreguen al final de la clase de datos. Esto no siempre es deseable.
  • Cuando una clase de datos hereda de otra clase de datos y la clase base tiene campos con valores predeterminados, todos los campos de la clase derivada también deben tener valores predeterminados.

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

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda