从 python 中的基础 class 继承 namedtuple
Inherit namedtuple from a base class in python
是否可以生成一个 namedtuple
从基数 class 继承而来的?
我想要的是 Circle
和 Rectangle
是 namedtuple
并且继承自共同基础 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
是否可以生成一个 namedtuple
从基数 class 继承而来的?
我想要的是 Circle
和 Rectangle
是 namedtuple
并且继承自共同基础 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