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

346
Views
Heredar de una clase base de tupla con nombre

Esta pregunta es lo opuesto a Heredar una tupla con nombre de una clase base en python , donde el objetivo es heredar una subclase de una tupla con nombre y no al revés.

En la herencia normal, esto funciona:

 class Y(object): def __init__(self, a, b, c): self.a = a self.b = b self.c = c class Z(Y): def __init__(self, a, b, c, d): super(Z, self).__init__(a, b, c) self.d = d

[afuera]:

 >>> Z(1,2,3,4) <__main__.Z object at 0x10fcad950>

Pero si la clase base es una namedtuple :

 from collections import namedtuple X = namedtuple('X', 'ab c') class Z(X): def __init__(self, a, b, c, d): super(Z, self).__init__(a, b, c) self.d = d

[afuera]:

 >>> Z(1,2,3,4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __new__() takes exactly 4 arguments (5 given)

La pregunta, ¿es posible heredar tuplas con nombre como clase base en Python? es asi, como?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Puede, pero debe anular __new__ que se llama implícitamente antes __init__ :

 class Z(X): def __new__(cls, a, b, c, d): self = super(Z, cls).__new__(cls, a, b, c) self.d = d return self >>> z = Z(1, 2, 3, 4) >>> z Z(a=1, b=2, c=3) >>> zd 4

¡Pero d será solo un atributo independiente!

 >>> list(z) [1, 2, 3]
over 4 years ago · Santiago Trujillo Report

0

Creo que puede lograr lo que desea al incluir todos los campos en la tupla con nombre original y luego ajustar la cantidad de argumentos usando __new__ como sugiere schwobaseggl arriba. Por ejemplo, para abordar el caso de max, donde algunos de los valores de entrada deben calcularse en lugar de proporcionarse directamente, lo siguiente funciona:

 from collections import namedtuple class A(namedtuple('A', 'abc computed_value')): def __new__(cls, a, b, c): computed_value = (a + b + c) return super(A, cls).__new__(cls, a, b, c, computed_value) >>> A(1,2,3) A(a=1, b=2, c=3, computed_value=6)
over 4 years ago · Santiago Trujillo Report

0

Vine aquí con exactamente el mismo problema, solo dos años después.
Personalmente pensé que el decorador de @property encajaría mejor aquí:

 from collections import namedtuple class Base: @property def computed_value(self): return self.a + self.b + self.c # inherits from Base class A(Base, namedtuple('A', 'ab c')): pass cls = A(1, 2, 3) print(cls.computed_value) # 6
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!