2014-04-04 44 views
0

我想知道在PyCxx生成的python擴展中定義屬性的正確方法。 目前我已經創建了Py::PythonClass的子類,如官方example。 我在初始化函數添加behaviors().supportGetattro();,創造了什麼是在PyCXX擴展中定義屬性的正確方法

Py::Object getattro(const Py::String &name_) 
{ 
    std::string name(name_.as_std_string("utf-8")); 

    if(name == "name") 
    { 
     return m_name; 
    } 
    else 
    { 
     return genericGetAttro(name_); 
    } 
} 

一個簡單的覆蓋到目前爲止好。在Python中,我獲得了obj.name的正確值,但唯一讓我不滿意的是當調用dir(obj)時,name屬性沒有列出。我該如何改變它?

+0

也許問題應該是如何在PyCXX中聲明屬性。訪問該屬性適用於上面的代碼,但我希望在打印對象的屬性和方法時也列出它,就像在不使用PyCXX時定義'tp_getset'時的情況一樣。 – Satara

+0

好吧,我現在通過使用'PyGetSetDef()'來添加屬性聲明。唯一的障礙是獲取'tp_getset'變量的訪問權限(保護),但我現在將'PythonType'的子類定義爲助手。 – Satara

回答

0

PyCXX的開發者Barry Scott提供了一個簡單的解決方案。 訣竅是,當調用dir()時,python要求getattr(const char *_name)中的值爲__members__。在這種情況下,可以返回包含屬性名稱作爲字符串的Py::List對象。

相關問題