如何在C中定义结构体

27 投票
4 回答
93130 浏览
提问于 2025-04-16 03:45

我打算定义一个结构体,然后把它传递给一个函数:

在C语言中:

struct stru {
int a;
int b;
};

s = new stru()
s->a = 10;

func_a(s);

那么在Python中怎么做呢?

4 个回答

8

抱歉我花了5天才回答这个问题,但我觉得有必要说一下。

可以这样使用 ctypes 模块:

from ctypes import *

class stru(Structure):
    _fields_ = [
        ("a", c_int),
        ("b", c_int),
    ]

当你需要做一些类似C语言的事情(比如使用C语言的数据类型或者使用C语言的DLL文件)时,ctypes 就是你需要的模块。而且,它是标准库的一部分,随时可以用。

13

如果你可以接受不可变的类型,那就使用命名元组。

import collections

struct = collections.namedtuple('struct', 'a b')

s = struct(1, 2)

否则,如果你想能创建多个实例,就定义一个类吧。

字典也是一个常见的解决方案。

如果你愿意,可以用这个函数来创建可变的类,语法和 namedtuple 一样。

def Struct(name, fields):
    fields = fields.split()
     def init(self, *values):
         for field, value in zip(fields, values):
             self.__dict__[field] = value
     cls = type(name, (object,), {'__init__': init})
     return cls

你可能还想添加一个 __repr__ 方法,让它更完整。你可以这样调用它:s = Struct('s', 'a b')。这样,s 就是一个类,你可以像这样实例化它:a = s(1, 2)。虽然还有很多可以改进的地方,但如果你经常需要做这些事情,这样做是值得的。

37

除非你的情况有特别之处没有告诉我们,否则就直接用下面这样的代码:

class stru:
    def __init__(self):
        self.a = 0
        self.b = 0

s = stru()
s.a = 10

func_a(s)

撰写回答