This question is asking the opposite of Inherit namedtuple from a base class in python , where the aim is to inherit a subclass from a namedtuple and not vice versa.
In normal inheritance, this works:
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
[out]:
>>> Z(1,2,3,4) <__main__.Z object at 0x10fcad950>
But if the baseclass is a namedtuple
:
from collections import namedtuple X = namedtuple('X', 'a b c') class Z(X): def __init__(self, a, b, c, d): super(Z, self).__init__(a, b, c) self.d = d
[out]:
>>> Z(1,2,3,4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __new__() takes exactly 4 arguments (5 given)
The question, is it possible to inherit namedtuples as a base class in Python? Is so, how?
As namedtuples are a subclass of tuples, the fields can be accessed via the index or by the name of the field. The index value of a field is tied to the order during the declaration of the namedtuple. Consider the above Address example. You can access the street field by name or by using 0 as the index value.
NamedTuple . The class created from typing.
@Antimony: pickle handles namedtuple classes just fine; classes defined in a function local namespace not so much.
Python namedtuple is an immutable container type, whose values can be accessed with indexes and named attributes. It has functionality like tuples with additional features. A named tuple is created with the collections. namedtuple factory function.
You can, but you have to override __new__
which is called implicitly before __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) >>> z.d 4
But d
will be just an independent attribute!
>>> list(z) [1, 2, 3]
I think you can achieve what you want by including all of the fields in the original named tuple, then adjusting the number of arguments using __new__
as schwobaseggl suggests above. For instance, to address max's case, where some of the input values are to be calculated rather than supplied directly, the following works:
from collections import namedtuple class A(namedtuple('A', 'a b c 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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With