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?
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]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)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