2010-09-06 26 views
15

voy a definir una estructura y pasarlo a una función:cómo definir una estructura como en C

En C:

struct stru { 
int a; 
int b; 
}; 

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

func_a(s); 

¿Cómo se puede hacer esto en Python?

+7

Usted debe leer los tutoriales para principiantes de Python en lugar que preguntar esto aquí. –

+3

'new' no es C; es C++. – strager

Respuesta

21

menos que haya algo especial acerca de su situación que no nos estás diciendo, sólo tiene que utilizar algo como esto:

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

s = stru() 
s.a = 10 

func_a(s) 
10

use tuplas con nombre si está bien con un tipo inmutable.

import collections 

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

s = struct(1, 2) 

De lo contrario, simplemente defina una clase si desea poder hacer más de una.

Un diccionario es otra solución canónica.

Si lo desea, puede utilizar esta función para crear clases mutables con la misma sintaxis que 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 

es posible que desee agregar un método __repr__ para la integridad. llámalo como s = Struct('s', 'a b'). s es entonces una clase que puede instanciar como a = s(1, 2). Hay mucho margen de mejora, pero si te encuentras haciendo este tipo de cosas mucho, pagaría por sí mismo.

+0

hola, segundo ejemplo (objeto()) no se puede compilar ... –

+0

Bin Chen. Correcto. Eso me sigue sucediendo a mí. – aaronasterling

2

Utilice las clases y el código de Python pensando en Python, evite simplemente escribir lo mismo pero en otra sintaxis.

Si necesita la estructura de cómo se almacena en la memoria, tratar módulo struct

5

Perdón por responder la pregunta 5 días después, pero creo que esto justifica contarlo.

Uso del módulo ctypes así:

from ctypes import * 

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

Cuando tenga que hacer algo parecido a C (es decir, tipos de datos C o incluso utilizar C DLL), ctypes es el módulo. Además, viene estándar

1

(para el futuro-google buscadores): la C/C manera más ++ de hacerlo - es el uso de la clase sin constructor:

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 
Cuestiones relacionadas