从python中的基类继承namedtuple

时间:2016-08-23 10:19:27

标签: python inheritance namedtuple

是否可以生成一个继承自基类的namedtuple

我想要的是CircleRectanglenamedtuple并且是从公共基类('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 个答案:

答案 0 :(得分:2)

你可以试试这个:

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

    pass

(您应该考虑在所有三个类中添加__slots__以节省内存和快速查找。)

答案 1 :(得分:1)

对于任何正在寻找一种方法来实现派生自另一种类型的不可变类型的人来说,冻结的 dataclassattrs 可能是比 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