2010-09-06 11 views
15

Je vais définir une structure et le transmettre en fonction:comment définir une structure comme en C

En C:

struct stru { 
int a; 
int b; 
}; 

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

func_a(s); 

Comment cela peut être fait en Python?

+7

Vous devriez lire les tutoriels Python débutant plutôt que de demander cela ici. –

+3

'new' n'est pas C; c'est C++. – strager

Répondre

21

, il suffit d'utiliser quelque chose comme ceci:

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

s = stru() 
s.a = 10 

func_a(s) 
10

utilisez des tuples nommés si vous êtes d'accord avec un type immuable.

import collections 

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

s = struct(1, 2) 

Sinon, définissez simplement une classe si vous voulez en créer plusieurs.

Un dictionnaire est une autre solution canonique.

Si vous voulez, vous pouvez utiliser cette fonction pour créer des classes mutables avec la même syntaxe 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 

vous pouvez ajouter une méthode __repr__ pour être complet. appelez-le comme s = Struct('s', 'a b'). s est alors une classe que vous pouvez instancier comme a = s(1, 2). Il y a beaucoup de place pour l'amélioration mais si vous vous trouvez en train de faire ce genre de choses beaucoup, cela paierait pour lui-même.

+0

salut, vous deuxième exemple (objet()) ne peut pas compiler ... –

+0

Bin Chen. Correct. Cela continue à m'arriver. – aaronasterling

2

Utilisez des classes et du code pensant Python en Python, évitez d'écrire simplement la même chose mais dans une autre syntaxe.

Si vous avez besoin du struct par la façon dont il est stocké dans la mémoire, à moins qu'il ya quelque chose de spécial au sujet de votre situation que vous ne nous dites pas le module essayer struct

5

Désolé de répondre à la question 5 jours plus tard, mais je pense que cela mérite d'être dit.

Utilisez le module ctypes comme ceci:

from ctypes import * 

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

Lorsque vous avez besoin de faire quelque chose de type C (à savoir C ou même utiliser des types de données DLLs C), ctypes est le module. En outre, il est livré en standard

1

(pour les futurs google-chercheurs): la façon la plus C/C++ de le faire - est d'utiliser la classe sans constructeur:

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 
Questions connexes