在boost.python中,如何暴露一个包含在另一个类中的类?
我想用boost::python做一些非常简单的事情。我能找到关于类成员函数的文档,也能找到关于继承类的文档,但就是找不到关于通过组合创建的类层次结构的语法。
我有一些C++代码,大致是这样的:
struct A{
double x,y;
};
struct B{
A foo;
double z;
};
我想把这两个类都暴露出来,这样在Python中我就可以写类似这样的代码:
spam = A()
spam.x=1
spam.y=2
eggs = B()
eggs.foo=spam
eggs.z = 33
Print eggs.foo.y
这肯定是可以的吧?但我就是搞不明白。
非常感谢!
编辑:
原来是虚惊一场……这个是自动完成的;如果你使用以下导出代码分别导出每个类:
class_<A>("A")
.def_readwrite("x",&A::x)
.def_readwrite("y",&A::y)
;
class_<B>("B")
.def_readwrite("z",&B::z)
.def_readwrite("foo",&B::foo)
;
让我困惑的是,你必须在Python中实例化这个类,才能通过dir()看到完整的子方法列表。也就是说,下面这两种方式的结果是不同的,你必须使用第二种方式才能得到完整的成员列表:
dir(B.foo)
dir(B().foo)
显然这里有一些Python的技术细节我还不太明白……如果有人能进一步解释一下就太好了。
1 个回答
0
关于dir的说明是:
如果对象是一个类型或类对象,返回的列表会包含它的属性名称,以及它的基类属性的名称。
在你的例子中,你的类成员被当作实例属性导出,而不是类属性。这是因为你想导出的是非静态的类成员。为了让dir返回属性,你需要先实例化这个类,因为属性在调用init方法之前是不存在的。
当你声明类属性时,调用dir时会显示这些属性,因为类属性是在类定义之后就存在的:
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
... name = "blah"
... def __init__(self):
... self.second_name = "blah2"
...
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_
_weakref__', 'name']
>>> f = Foo()
>>> f
>>> dir(f)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_
_weakref__', 'name', 'second_name']