2011-04-26 39 views
2

我想用boost :: python來做一些非常簡單的事情。我可以找到類成員函數的文檔以及繼承類的文檔(bleurch),但是我找不到通過編譯創建的類層次結構的語法。在boost.python中;我如何公開一個包含在另一個類中的類(通過組合)?

所以我有一個是這樣的一些C++代碼:

struct A{ 
    double x,y; 
}; 

struct B{ 
    A foo; 
    double z; 
}; 

而且我要揭露這兩個類,以便在python我可以寫這樣的:

spam = A() 
spam.x=1 
spam.y=2 

eggs = B() 
eggs.foo=spam 
eggs.z = 33 
Print eggs.foo.y 

當然這是可能的?但我無法弄清楚。

非常感謝!

編輯:

誤報...它會自動完成。如果您使用以下出口代碼添加到每個單獨導出:

class_<A>("A") 
    .def_readwrite("x",&A::x) 
    .def_readwrite("y",&A::y) 
; 

class_<B>("B") 
    .def_readwrite("z",&B::z) 
    .def_readwrite("foo",&B::foo) 
; 

什麼扔我是,你必須實例化的python前級子方法的完整列表變得與DIR()即可見,下面產生不同結果,你必須使用第二類型得到一個完整的會員列表:

dir(B.foo) 
dir(B().foo) 

顯然,一些蟒蛇技術性問題會在這裏,我還不知道......任何進一步澄清歡迎。

dir

回答

0

文件說:

如果對象是一個類型或類對象,列表中包含了屬性的名稱,並遞歸其基地的屬性。

在你的例子中,你的類成員是作爲實例屬性而不是導出非靜態類成員時所需的類屬性導出的。這就是爲什麼您需要在python中實例化類以便dir返回屬性的原因,因爲直到調用init方法之前屬性才存在。

在聲明類的屬性,他們將類型的主叫DIR時,因爲類的類定義後右鍵屬性顯示:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class Foo(object): 
...  name = "blah" 
...  def __init__(self): 
...   self.second_name = "blah2" 
... 
>>> dir(Foo) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut 
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e 
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_ 
_weakref__', 'name'] 
>>> f = Foo() 
>>> f 
>>> dir(f) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut 
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e 
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_ 
_weakref__', 'name', 'second_name'] 
相關問題