【发布时间】:2011-08-20 21:17:33
【问题描述】:
我不知道为什么这个程序会失败。
#!/usr/bin/env python
from __future__ import division, print_function
from future_builtins import *
import types
import libui as ui
from PyQt4 import QtCore
import sip
p = ui.QPoint()
q = QtCore.QPoint()
def _q_getattr(self, attr):
print("get %s" % attr)
value = getattr(sip.wrapinstance(self.myself(), QtCore.QPoint), attr)
print("get2 %s returned %s" % (attr, value))
return value
p.__getattr__ = types.MethodType(_q_getattr, p)
print(p.__getattr__('x')()) # Works! Prints "0"
print(p.x()) # AttributeError: 'QPoint' object has no attribute 'x'
我使用 Boost.Python 创建了 libui,它公开了 QPoint 类。我也包括了 PyQt4,它有一个 sip-exposed QPoint。我正在尝试完成这两种类型之间的映射。
我检查了p 是一个新式类,那么为什么__getattr__ 不被称为p.x()?
【问题讨论】:
-
我建议先尝试使用多重继承进行子类化。
-
如果我子类化,会不会有底层 C++ QPoint 对象的两个副本?那么,在 Python 中设置成员变量对 C++ 来说是不可见的,反之亦然?
-
你不能只使用其中一个吗?还是使用mixin类?只是问一下,我对 Qt 和 Boost 都不熟悉。
-
@Keith:我正在尝试用 C++ 和 Python 编写一些代码。 Boost.Python 是一个库,可以让我将 C++ 类导出到 Python。 sip 做同样的事情,并被 PyQt 用来将 Qt 导出到 Python。在你不想来回传递 Qt 对象的 Qt 应用程序中,很难有一些 Python 代码和一些 C++ 代码。
标签: python pyqt boost-python python-sip