在boost.python中;如何公开另一个类中包含的类(通过合成)?

时间:2011-04-26 15:18:13

标签: c++ python class boost member

我想用boost :: python做一些非常简单的事情。我可以找到类成员函数的文档和继承类的文档(bleurch),但是我找不到暴露通过组合创建的类层次结构的语法。

所以我有一些类似的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)
;

让我感到震惊的是,你必须在使用dir()显示子方法的完整列表之前在python下实例化该类,即,以下产生不同的结果,并且必须使用第二种类型来获得完整的成员列表:

dir(B.foo)
dir(B().foo) 

显然有一些python技术问题在这里发生,我还不明白......任何进一步的澄清欢迎。

1 个答案:

答案 0 :(得分:0)

dir的文档说:

  

如果对象是类型或类对象,则列表包含其属性的名称,并且递归地包含其基础的属性。

在您的示例中,您的类成员将导出为实例属性,而不是导出非静态类成员时所需的类属性。这就是为什么你需要在python中实例化类以便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']