在python中创建类似C/C++的类似对象的最佳方法是什么?

cha*_*com 1 python struct

我一直在从Matlab转到NumPy/Scipy,我认为NumPy在很多方面都很棒.

但是我觉得不舒服的一件事是我找不到类似于structC/C++ 的数据结构.

例如,我可能想要做以下事情:

struct Parameters{
  double frame_size_sec;
  double frame_step_sec;
}
Run Code Online (Sandbox Code Playgroud)

一种最简单的方法是使用字典如下.

  parameters = {"frame_size_sec" : 0.0, "frame_step_sec", 0.0}
Run Code Online (Sandbox Code Playgroud)

但是在字典的情况下,与struct不同,可以添加任何键.我想限制钥匙.

另一个选项可能是使用如下的类.但它也有同样类型的问题.

class Parameters:
  frame_size_sec = 0.0
  frame_step_sec = 0.0
Run Code Online (Sandbox Code Playgroud)

从一个线程,我看到有一个名为名为tuple的数据结构,看起来很棒,但最大的问题是字段是不可变的.所以它仍然与我想要的不同.

总而言之,在python中使用类似结构的对象的最佳方法是什么?

Sha*_*ger 5

如果您不需要实际的内存布局保证,则用户定义的类可以使用它们将实例成员集限制为固定列表__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)
Run Code Online (Sandbox Code Playgroud)

为你提供一个初始化的类,它保证分配两个float成员,没有人可以向类的任何实例添加新的实例属性(意外或故意).

请阅读__slots__文档中的警告; 例如,在继承的情况下,如果超类没有定义__slots__,那么子类仍然具有__dict__,因此可以在其上定义任意属性.

如果你需要内存布局保证和变量的更严格的(C)类型,你会想看看ctypes Structures,但是从你所说的,听起来你只是试图强制执行一组固定的,有限的属性,不是特定的类型或内存布局.