力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

最近看了下用Boost.Python封装C++供Python调用。在捣鼓的过程中遇到一个费解的异常:
TypeError: unbound method Boost.Python.function object must be called with MyClass instance as first argument (got nothing instead)
最终尽管可以正常使用了,但仍是一头雾水。



前期工作

1. 用Python封装C++类Vector3:

1   class_<Vector3>("Vector3")
2      .def_readwrite("x"&Vector3::x)
3      .def_readwrite("y"&Vector3::y)
4      .def_readwrite("z"&Vector3::z)
5      .def("normalise",   &Vector3::normalise)
6      .def("length",      &Vector3::length)
7      .def("distance",    &Vector3::distance)
8      .def(self += self)
9      .def(self -= self)


2. 用Python调用

构造一个Vector3对象,测试其功能

pt = AnyCAD.Vector3
pt.x 
= 100
pt.length()

3. 输出结果
100.0
Traceback (most recent call last):
  File 
"D:\testx.py", line 17in <module>
    pt.length()
TypeError: unbound method Boost.Python.function object must be called with Vecto
r3 instance as first argument (got nothing instead)


4. 修改测试脚本:
pt = AnyCAD.Vector3()
pt.x 
= 100
pt.length()

运行正常。

问题分析

Python抛出的异常说是unbound method的问题,实在找不出封装的过程有什么问题。
仔细分析下可以猜测2中的pt似乎并不是Vector3的一个实例。
验证一下:
pt = AnyCAD.Vector3()
pt.x 
= 100
pt.length()
print pt

pt2 
= AnyCAD.Vector3
pt2.x 
= 100
pt2.length()
print pt

输出结果:

<AnyCADPlatformPython.Vector3 object at 0x04732FC0>
<class 'AnyCADPlatformPython.Vector3'>

至此真相大白。
posted on 2010-03-16 20:17 力为 阅读(6993) 评论(1)  编辑 收藏 引用

评论

# re: 【Boost.Python】unbound method 错误 2013-03-04 16:33 tb
测试才行 呵呵  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理