带有抽象类的 Python ctypes
Posted
技术标签:
【中文标题】带有抽象类的 Python ctypes【英文标题】:Python ctypes with Abstract classes 【发布时间】:2013-12-18 15:59:58 【问题描述】:我想将 Python 中的 C++ 类与 ctypes 库一起使用:
我的 C++ 类:
class ClassAInteface
protected:
ClassAInterface()
public:
virtual ~ClassAInteface()
virtual void MethodA() = 0;
;
class ConcreteClassA : public ClassAInteface
public:
ConcreteClassA();
virtual ~ConcreteClassA();
//ClassAInteface Methods
void MethodA();
;
//Second class which uses the First class
class ClassB
public:
ClassB(ClassAInteface* firstClass);
virtual ~ClassB();
void MethodB(int param);
现在我想在 Python 中将这些类与 CTypes 一起使用:
extern "C"
ConcreteClassA* ConcreteClassA_new() return new ConcreteClassA();
void MethodA(ConcreteClassA* classA) classA->MethodA();
ClassB* ClassB_new(ConcreteClassA* classA) return new ClassB(classA);
void MethodB(ClassB* classB,int param) dl->MethodB(param);
在 Python 中使用第一个类适用于: ...导入共享库 ... --> sharedLib
#Create a Python Class
class ClassA(object):
def __init__(self):
self.obj = sharedLib.ConcreteClassA_new()
def MethodA(self):
sharedLib.MethodA(self.obj)
objA = ClassA()
但是当我想在 Pyhton 中同时使用第二类和第一类时:
class ClassB(object):
def __init__(self,firstClass):
self.obj = sharedLib.ClassB_new(firstClass)
def Drive(self):
sharedLib.MethodB(self.obj,angle)
objA = ClassA()
objB = ClassB(objA)
我明白了:
self.obj = sharedLib.ClassB_new(firstClass) ctypes.ArgumentError: 论据 1: : 不知道如何转换 参数1
我认为没有抽象类它会工作吗? 但是我怎样才能轻松地在 Python 中使用我的类呢?
【问题讨论】:
我很惊讶你能成功地创建一个抽象ClassAInteface
的实例,因为它的构造函数的 private
和 ConcreteClassA_new()
函数没有声明为 friend
也不是派生类。除此之外,您不能将抽象类用作函数返回类型,因此该函数不应编译。
ConcreteClass_new() 函数只是一个创建 ConcreteClass 指针的函数,不需要 i 将其声明为友元或派生类,这里是一个很好的例子:link
ConcreteClassA_new()
函数返回一个指针,指向动态分配的ConcreteClassA
instance 它通过new
运算符和类创建默认构造函数。
【参考方案1】:
ctypes 如何知道使用obj
属性?使用_as_parameter_
。
首先,确保您正在设置参数和结果类型。 ctypes 默认使用 C int
,这将使 64 位指针无效。
sharedLib.ConcreteClassA_new.restype = c_void_p
sharedLib.ClassB_new.restype = c_void_p
sharedLib.ClassB_new.argtypes = [c_void_p]
sharedLib.MethodA.restype = None
sharedLib.MethodA.argtypes = [c_void_p]
sharedLib.MethodB.restype = None
sharedLib.MethodB.argtypes = [c_void_p, c_int]
class ClassA(object):
def __init__(self):
self._as_parameter_ = sharedLib.ConcreteClassA_new()
def MethodA(self):
sharedLib.MethodA(self)
【讨论】:
以上是关于带有抽象类的 Python ctypes的主要内容,如果未能解决你的问题,请参考以下文章