2010-09-06 21 views
15

ho intenzione di definire una struttura e passare in una funzione:come definire una struttura come in C

In C:

struct stru { 
int a; 
int b; 
}; 

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

func_a(s); 

Come questo può essere fatto in Python?

+7

dovreste leggere il tutorial per principianti Python piuttosto che chiedere questo qui. –

+3

'new' non è C; è C++. – strager

risposta

21

A meno che non ci sia qualcosa di speciale circa la vostra situazione che non ci stai dicendo, basta usare qualcosa di simile:

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

s = stru() 
s.a = 10 

func_a(s) 
10

usare tuple con nome se si sta bene con un tipo immutabile.

import collections 

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

s = struct(1, 2) 

Altrimenti, basta definire una classe se si desidera poterne creare più di una.

Un dizionario è un'altra soluzione canonica.

Se si desidera, è possibile utilizzare questa funzione per creare classi mutevoli con la stessa sintassi 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 

si potrebbe desiderare di aggiungere un metodo __repr__ per completezza. chiamalo come s = Struct('s', 'a b'). s è quindi una classe che è possibile creare un'istanza come a = s(1, 2). C'è molto spazio per migliorare, ma se ti ritrovi a fare questo genere di cose molto, si ripagherebbe da solo.

+0

ciao, secondo esempio (oggetto()) non può compilare ... –

+0

Bin Chen. Corretta. Questo continua a succedermi. – aaronasterling

2

Utilizzare classi e codice Python pensando in Python, evitare di scrivere solo la stessa cosa ma in un'altra sintassi.

Se avete bisogno della struct da come è archiviato nella memoria, provare modulo struct

5

Siamo spiacenti di rispondere alla domanda 5 giorni dopo, ma penso che questo meriti di essere raccontato.

Utilizza il modulo ctypes in questo modo:

from ctypes import * 

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

Quando avete bisogno di fare qualcosa di simile al C (vale a dire i tipi di dati C o anche utilizzare C DLL), ctypes è il modulo. Inoltre, si tratta di serie

1

(per il futuro Google ricercatori): il ++ modo più C/C di farlo - è quello di utilizzare classe senza costruttore:

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 
Problemi correlati