Наследовать namedtuple из базового класса в Python
Можно ли произвести namedtuple
который наследует от базового класса?
Что я хочу это Circle
а также Rectangle
являются namedtuple
s и наследуются от общего базового класса ('Shape'):
from collections import namedtuple
class Shape:
def addToScene(self, scene):
...
Circle=namedtuple('Circle', 'x y radius')
Rectangle=namedtuple('Rectangle', 'x1 y1 x2 y2')
Как бы я это сделал?
2 ответа
Решение
Вы можете попробовать это:
class Circle(Shape, namedtuple('Circle', 'x y radius')):
pass
(Вы должны рассмотреть возможность добавления __slots__
всем вашим трем классам, чтобы сэкономить память и значительно ускорить поиск.)
Для тех, кто ищет способ реализовать неизменяемый тип, производный от другого типа, замороженныйили жеattrs
может быть лучшим вариантом, чем
namedtuple
.
Пример использования
dataclass
:
class Base:
def fun(self):
print('Base()')
@dataclass(frozen=True)
class MyType(Base):
x: int
Таким образом, вы можете позвонить
fun()
на
MyType
пример:
my_type = MyType([1, 2])
my_type.fun()
Но не может назначать своим членам:
my_type = MyType([1, 2])
#my_type.x = [10, 20]
Обратите внимание, что изменяемые члены все еще могут быть изменены:
my_type = MyType([1, 2])
my_type.x[0] = 10