在boost.python中,如何暴露一个包含在另一个类中的类?

2 投票
1 回答
1215 浏览
提问于 2025-04-16 16:27

我想用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']

撰写回答