Наследовать namedtuple из базового класса в Python

Можно ли произвести namedtuple который наследует от базового класса?

Что я хочу это Circle а также Rectangle являются namedtuples и наследуются от общего базового класса ('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
Другие вопросы по тегам