我一直在从 Matlab 转向 NumPy/Scipy,我认为 NumPy 在很多方面都很棒。
但让我感到不舒服的一件事是,我在 C/C++ 中找不到类似于 struct 的数据结构。
例如,我可能想做以下事情:
struct Parameters{
double frame_size_sec;
double frame_step_sec;
}
一种最简单的方法是使用字典,如下所示。
parameters = {"frame_size_sec" : 0.0, "frame_step_sec", 0.0}
但在字典的情况下,与结构不同,可以添加任何键。我想限制 key 。
另一种选择可能是使用如下类。但它也有同样类型的问题。
class Parameters:
frame_size_sec = 0.0
frame_step_sec = 0.0
从一个线程中看到有一个数据结构叫named tuple,看起来不错,但是最大的问题就是字段是不可变的。所以还是和我想要的不一样。
总而言之,在 python 中使用类结构对象的最佳方式是什么?
请您参考如下方法:
如果您不需要实际的内存布局保证,用户定义的类可以使用 __slots__ 将它们的实例成员集限制在一个固定的列表中。 .例如:
class Parameters: # On Python 2, class Parameters(object):, as __slots__ only applies to new-style classes
__slots__ = 'frame_size_sec', 'frame_step_sec'
def __init__(self, frame_size_sec=0., frame_step_sec=0.):
self.frame_size_sec = float(frame_size_sec)
self.frame_step_sec = float(frame_step_sec)
为您提供一个在初始化时保证分配两个 float 成员的类,并且任何人都不能(无意或有意)向该类的任何实例添加新的实例属性。
请阅读__slots__ 文档中的注意事项;例如,在继承情况下,如果父类(super class)没有定义 __slots__,那么子类仍将具有 __dict__,因此可以在其上定义任意属性。
如果您需要内存布局保证和更严格的 (C) 变量类型,您需要查看 ctypes Structures ,但从你所说的来看,听起来你只是在尝试强制执行一组固定的、有限的属性,而不是特定类型或内存布局。
