2009-02-07 140 views
4

我正在嘗試使用PyCXX創建一個簡單的Python擴展。我正在編譯我的Python 2.5安裝。Python無法創建實例

我的目標是能夠做到在Python如下:

import Cats 

kitty = Cats.Kitty() 

if type(kitty) == Cats.Kitty: 
    kitty.Speak() 

但每次我試圖,這是我的錯誤:

TypeError: cannot create 'Kitty' instances

它不看Cats.Kitty作爲類型對象,但我無法創建Kitty類的實例,有什麼想法?

這裏是我的電流源:

#include "CXX/Objects.hxx" 
#include "CXX/Extensions.hxx" 
#include <iostream> 

using namespace Py; 
using namespace std; 

class Kitty : public Py::PythonExtension<Kitty> 
{ 
    public: 
     Kitty() 
     { 
     } 

     virtual ~Kitty() 
     { 
     } 

     static void init_type(void) 
     { 
      behaviors().name("Kitty"); 
      behaviors().supportGetattr(); 

      add_varargs_method("Speak", &Kitty::Speak); 
     } 

     virtual Py::Object getattr(const char *name) 
     { 
      return getattr_methods(name); 
     } 

     Py::Object Speak(const Py::Tuple &args) 
     { 
      cout << "Meow!" << endl; 
      return Py::None(); 
     } 
}; 

class Cats : public ExtensionModule<Cats> 
{ 
    public: 
     Cats() 
      : ExtensionModule<Cats>("Cats") 
     { 
      Kitty::init_type(); 

      initialize(); 

      Dict d(moduleDictionary()); 
      d["Kitty"] = Type((PyObject*)Kitty::type_object()); 
     } 

     virtual ~Cats() 
     { 
     } 

     Py::Object factory_Kitty(const Py::Tuple &rargs) 
     { 
      return Py::asObject(new Kitty); 
     } 
}; 

void init_Cats() 
{ 
    static Cats* cats = new Cats; 
} 


int main(int argc, char* argv[]) 
{ 
    Py_Initialize(); 

    init_Cats(); 

    return Py_Main(argc, argv); 

    return 0; 
} 

回答

2

我do'nt看到它的代碼,但諸如此類的事情通常意味着它不能創建一個實例,這意味着它不能找到一個構造函數。你確定你有一個正好匹配預期的簽名?

+0

你說得對,我想。他必須在某處「註冊」Kitty的名字 – Emiliano 2009-02-11 16:24:09