2010-09-06 94 views
15

我要定義一個結構,並將它傳遞到一個函數的結構:如何定義類似於C

在C:

struct stru { 
int a; 
int b; 
}; 

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

func_a(s); 

這可怎麼在Python做呢?

+7

你應該閱讀初學者的Python教程,而比在這裏問這個問題。 – 2010-09-06 01:03:32

+3

'new'不是C;它是C++。 – strager 2010-09-06 01:20:05

回答

21

除非有什麼特別的你的情況,你不告訴我們,只要用這樣的:

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

s = stru() 
s.a = 10 

func_a(s) 
10

如果你確定使用不可變類型,則使用命名元組。

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)。有很大的改進空間,但如果你發現自己做這種事情很多,它會爲自己付出代價。

+0

嗨,你的第二個例子(object())不能編譯... – 2010-09-06 00:57:42

+0

陳斌。正確。這一直在發生在我身上。 – aaronasterling 2010-09-06 01:05:40

2

在Python中使用類和代碼Python思想,避免只寫另一種語法的同樣的東西。

如果你需要它是如何存儲在內存中的結構,儘量模塊struct

5

5天后,很抱歉回答這個問題,但我認爲這是值得說明的。

使用​​模塊,像這樣:

from ctypes import * 

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

當你需要做一些類似C(即ç數據類型,甚至用C的DLL),​​是模塊。此外,它標配

1

(對於未來谷歌搜索): 做的大多數C/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