2013-07-11 75 views
1

有沒有更好的方式來初始化一個ctypes字段,它的意思是靜態的/常量比我下面有什麼?更好的方式來初始化python的ctypes結構字段

from ctypes import * 

class foo(LittleEndianStructure): 
    _fields_ = [ 
    ("signature", c_ulonglong), 
    ] 

    def __init__(self): 
     super(LittleEndianStructure,self).__init__() 
     self.signature = 0x896489648964 

f = foo() 
print hex(f.signature) 

例如,我希望我可以做一些類似如何你可以用普通的Python對象做什麼:

class bar: 
    signature = 0x896489648964 

b = bar() 
print hex(b.signature) 
+1

這應該是'super(foo,self).__ init __(0x896489648964)'。 – eryksun

回答

2

簡短的回答是否定的,你不能做到這一點,並且不應該想要。


您的正常Python對象示例不會做你的想法。它不會自動初始化實例屬性;它正在創建一個類屬性。

他們在某些情況下工作類似,但他們不是同一件事。例如,比較:

>>> class Foo(object): 
...  bar=[] 
...  def __init__(self): 
...   self.baz=[] 
... 
>>> f1 = Foo() 
>>> f2 = Foo() 
>>> f1.bar.append(100) 
>>> f1.baz.append(100) 
>>> f2.bar 
[100] 
>>> f2.baz 
[] 

這裏,f1f2每個初始化自己baz,但他們不自動初始化自己bar - 他們與其他所有實例共享一個bar

而且,更爲直接相關,這種情況下:

>>> f1.__dict__ 
{'baz': [1]} 

bar類屬性不是f1的字典裏的一部分。

所以,翻譯同樣的事情​​,你"signature"不會是你的結構中的一員,如果你做了它的類屬性,也就是說,它不會在內存佈局爲每個實例的一部分。這會打敗擁有它的整個目的。


如果您瞭解C++,可能有助於從C++的角度來看待它。

上面的bar這樣的類屬性有點類似於C++中的靜態成員變量,而實例屬性就像普通的實例成員變量。

在該C++代碼:

struct bar { 
    static const long signature = 0x896489648964; 
}; 

...每個bar實際上是一個空的結構;有一個單獨的bar::signature存儲在內存中的其他地方。您可以通過bar實例來引用它,但僅僅是因爲編譯器將b1.signature轉換爲bar::signature


*我說的原因「之類的」是Python類屬性可以被子類覆蓋,而C++中的靜態成員不能,他們真的只是全局變量,它們只能是「隱藏」由子類。