在 boost.python 中;如何公开包含在另一个类中的类(通过组合)?
Posted
技术标签:
【中文标题】在 boost.python 中;如何公开包含在另一个类中的类(通过组合)?【英文标题】:In boost.python; how do I expose a class that is contained in another class (via composition)? 【发布时间】:2011-04-26 15:18:12 【问题描述】:我想用 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)
;
让我感到震惊的是,您必须在子方法的完整列表通过 dir() 可见之前在 python 下实例化该类,即以下产生不同的结果,并且您必须使用第二种类型来获得完整的成员列表:
dir(B.foo)
dir(B().foo)
显然这里有一些我还不明白的python技术细节......欢迎任何进一步的澄清。
【问题讨论】:
【参考方案1】: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']
【讨论】:
以上是关于在 boost.python 中;如何公开包含在另一个类中的类(通过组合)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 boost/python 向 python 公开 C++ 虚函数?