Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

269
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!