【Boost.Python】unbound method 错误

【Boost.Python】unbound method 错误

最近看了下用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  17 in   < 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'>

至此真相大白。

你可能感兴趣的:(【Boost.Python】unbound method 错误)