Форум сайта python.su
А как ее вернуть? Все что я вижу в питоне - это класс NPC, а мне нужен определенный экземпляр, при чем питон вызывается из самого этого экземпляра.
Отредактировано (Фев. 24, 2010 21:36:04)
Офлайн
class NPC{
public:
void move(int x, int y, int z);
void runAI();
};
...
void NPC::runAI(){
...
dict globals, locals;
locals["self"] = NPC_Class::from_this(this);
exec("self.move(1,2,3)", globals, locals);
}
wolf = NPC();
wolf.runAI();
//и после этого волк перемещается в (1,2,3)
Офлайн
Не получается вызвать NPC_Class::from_this(this), компилятор говорит, что ‘NPC_Class’ is not a class or namespace.
Офлайн
class_<A> A_class;
BOOST_PYTHON_MODULE("module"){
A_class = class_<A>("A")
.def("setA()", &A::setA);
}
Офлайн
Я вроде так и делал.. вот кусок целиком
namespace bp = boost::python;
bp::class_<NPC> NPC_Class;
BOOST_PYTHON_MODULE(NPC){
NPC_Class = bp::class_<NPC>("NPC")
.def("getHP", &NPC::getHP)
.def("setHP", &NPC::setHP);
}
void NPC::initPython(){ // это вызывается в конструкторе
Py_Initialize();
initNPC();
}
void NPC::step(){
try{
bp::dict globals, locals;
locals["self"] = NPC_Class::from_this(this); // NPC.cpp:89: ошибка: ‘NPC_Class’ is not a class or namespace
bp::exec("print 'hello python'\n"
"print self.getHP()\n",
globals, locals);
}
catch(bp::error_already_set const &){
PyErr_Print();
}
}
NPC npc;
npc.setHP(50);
npc.step();
Отредактировано (Март 1, 2010 16:48:02)
Офлайн
ааа. Так from_this нужно еще самому написать - я имел в виду что-то, что берет С++ указатель и возвращает готовый python объект.
Здесь возникают неприятные проблемы с временем жизни объекта - но в простейшем случае что-то вроде
locals = bp::ptr(this);
должно помочь.
Офлайн
Кое что получилось
NPC* NPC::self(){
return this;
// return bp::ptr(this) // тоже пробовал
}
...
void NPC::step(){
...
locals["self"] = self();
...
}
Офлайн
А вы проверьте - кажется, у вас locals = self(); сделает копирование. NPC_Class - сейчас не нужен.
Офлайн
А как это узнать? Я же вроде ссылку передаю.
В секции BOOST_PYTHON_MODULE(NPC){…} мне не надо добавлять классу NPC мой метод self()?
Офлайн
bp::object NPC::self(){
return bp::ptr(this);
}
Офлайн