Ответ 1
Если у вас нет какой-то особой ситуации, о которой вы нам не говорите, просто используйте что-то вроде этого:
class stru:
def __init__(self):
self.a = 0
self.b = 0
s = stru()
s.a = 10
func_a(s)
Я собираюсь определить структуру и передать ее в функцию:
В C:
struct stru {
int a;
int b;
};
s = new stru()
s->a = 10;
func_a(s);
Как это можно сделать в Python?
Если у вас нет какой-то особой ситуации, о которой вы нам не говорите, просто используйте что-то вроде этого:
class stru:
def __init__(self):
self.a = 0
self.b = 0
s = stru()
s.a = 10
func_a(s)
используйте названные кортежи, если вы в порядке с неизменяемым типом.
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)
. Там много возможностей для улучшения, но если вы обнаружите, что делаете такие вещи много, он будет платить за себя.
Извините, что ответила на вопрос 5 дней спустя, но я думаю, что это гарантирует.
Используйте модуль ctypes
следующим образом:
from ctypes import *
class stru(Structure):
_fields_ = [
("a", c_int),
("b", c_int),
]
Если вам нужно сделать что-то вроде C (например, C типа данных или даже использовать C DLL), ctypes
- это модуль. Кроме того, он поставляется со стандартным
Используйте классы и код Python-мышления в Python, избегайте просто писать одно и то же, но в другом синтаксисе.
Если вам нужна структура, как она хранится в памяти, попробуйте модуль struct
(для будущих поисковиков Google): самый C/С++ способ сделать это - использовать класс без конструктора:
class my_struct:
name = ''
health = 0.0
count = 0
values_list = [1,2,3]
s1 = my_struct()
s1.count = 5
s1.name = 'some string'
s1.health = 0.1
s1.values_list = [4,5,6]
print s1.name
# some string