带有抽象类的 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 的实例,因为它的构造函数的 privateConcreteClassA_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的主要内容,如果未能解决你的问题,请参考以下文章

返回带有抽象类的 unique_ptr

带有案例类的抽象类的scala circe编码器/解码器

JAVA抽象类的定义与使用

使用带有某些基类、抽象类或特征的列表参数化的类型类的最佳方法

python抽象类

接口类 和 抽象类