从 python 中的基础 class 继承 namedtuple

Inherit namedtuple from a base class in python

是否可以生成一个 namedtuple 从基数 class 继承而来的?

我想要的是 CircleRectanglenamedtuple 并且继承自共同基础 class ('Shape'):

from collections import namedtuple

class Shape:
    def addToScene(self, scene):
         ...

Circle=namedtuple('Circle', 'x y radius')
Rectangle=namedtuple('Rectangle', 'x1 y1 x2 y2')

我该怎么做?

你可以试试这个:

class Circle(Shape, namedtuple('Circle', 'x y radius')):

    pass

(您应该考虑将 __slots__ 添加到所有三个 类 以节省内存并加快查找速度。)

对于任何正在寻找一种方法来实现派生自另一种类型的不可变类型的人来说,冻结 dataclass or attrs 可能是比 namedtuple 更好的选择。

使用dataclass的示例:

class Base:
    def fun(self):
        print('Base()')


@dataclass(frozen=True)
class MyType(Base):
    x: int

这样,您可以在 MyType 实例上调用 fun()

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