2010-07-16 44 views
5

我有一個關於靜態變量和TypeObjects的小問題。 我使用API​​ C來包裝一個名爲x的靜態變量的C++對象(我們稱之爲Acpp)。 讓我們打電話給我TypeObject A_Object:Python API C++:類型對象的「靜態變量」

typedef struct { 
    PyObject_HEAD 
    Acpp* a; 
} A_Object; 

的TypeObject連接到我的Python模塊 「myMod」 爲 「A」。我已經定義了getter和setter方法(tp_getset),這樣我就可以訪問和修改蟒ACPP的靜態變量:

>>> import myMod 
>>> myA1 = myMod.A(some args...) 
>>> myA1.x = 34 # using the setter to set the static variable of Acpp 
>>> myA2 = myMod.A(some other args...) 
>>> print myA2.x 
34 
>>> # Ok it works ! 

此解決方案,但它不是真正的「乾淨」。我想通過TypeObject而不是實例訪問蟒蛇靜態變量:

>>> import myMod 
>>> myMod.A.x = 34 # what I wish... 

沒有任何人有一個想法,以幫助我嗎?

在此先感謝。

回答

1

基本上,你要做的是定義一個「靜態屬性」。也就是說,當你需要/設置一個類的屬性時,你需要調用一個函數。記住

有了這一點,你可能會發現this thread有趣。它只針對這個問題討論Python級別的解決方案,而不是C擴展類型,但它涵蓋了基本原則。

爲了在該線程中爲C擴展類型實現該解決方案,我認爲你必須初始化tp_dict併爲其添加一個「x」的條目,其值是適當地實現__get__的對象。

+0

謝謝你的回答。我認爲我可以通過在調用PyType_Ready之後向tp_dict添加一個字段來解決我的問題。 – ThR37 2010-07-19 08:56:11

0

你可以在A_Object添加一個虛擬的「X」區域,創建一個對一套/ get方法。當您訪問虛擬「x」字段時,該方法會將該呼叫重定向到靜態「x」字段。

+0

謝謝您的回答,但是,實際上,問題來自於事實,我沒有看到任何方式限定一對集/獲取的TypeObject本身的方法:所有我們可以定義是該類型的實例。 因此,當我嘗試invoque myMod.A.x我在當前版本中得到: <屬性「myMod.A」對象「X」>我沒有看到在A_Object添加字段的點。我可以通過Acpp :: x輕鬆訪問「x」(這就是我在爲類型對象的實例定義的getter/setter對中所做的)。 – ThR37 2010-07-16 15:04:22