Python4Delphi: 使用Delphi代码调用Python代码里面的类

书接上回。

上一篇我写了如何用 Delphi 代码调用 Python 代码里面的函数。

这一篇如题。

问题:

假设有一个 Python 的开源代码,里面有一个类,比较复杂,它有比较复杂的算法,刚好我们在写 Delphi 程序的时候需要。如何用 Delphi 直接调用这个类,使用它的算法?

Python 代码如下:

class MyPerson:
    def __init__(self, FirstName, LastName):
        self.MyFirstName = FirstName
        self.MyLastName = LastName
    def GetMyFirstName(self):
        print(self.MyFirstName)
        return (self.MyFirstName + "  - Hello")

上面的代码,定义了一个 Python 的一个类。这个类有两个方法:

一个是 init;

另一个是 GetMyFirstName;

注意,按照 Python 语法,一个类的方法,不管有没有参数,必须至少有一个参数:self;

注意,Python 的类,init 方法就是创建这个类的对象时的默认方法,类似 Delphi 的类方法 Create.

Delphi 这边的代码

1. 首先,我们新建一个 Delphi 的 VCL 程序;

2. 拖两个控件到界面上:PythonEngine1 和 PythonGUIInputOutput1;控件属性设置请看前面的文章。

3. 界面用于操作和显示的控件,Button1, Memo1, Memo2 拖到界面上。

4. 在 Memo2.Lines 里面填入上面的 Python 的代码。这个 Delphi 程序的设计就完成了。开始写代码。

uses
  VarPyth; //用这个获取 Python 的 MainModule

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
  PyObj: Variant;
  AName: Variant;
begin
  PythonEngine1.ExecStrings(Memo2.Lines);
  PyObj := MainModule.MyPerson('Jack', 'Chen'); //创建 Python 对象。这里是调用了 Python 类的 init 方法
  AName := 'abc';
  AName := PyObj.GetMyFirstName();
  Memo1.Lines.Add(VarToStr(AName));      //VarToStr 需要引用 System.Variants 单元。
end;
上面 Delphi 的代码需要注意:

1. AName 如果声明成 string,程序可以编译通过。运行时,Python 模块会出错。这里必须声明成 Variant;

2. 创建 Python 对象的方式,和 Python 代码的方式相同。直接调用 Python 类的名称,加上其 init 方法里面的参数。这就是 PyObj := MainModule.MyPerson() 这行代码的意思,创建一个 Python 的对象并返回给 Delphi 的一个 Variant 的变量。这里的 MainModule 在上一篇文章里面有解释。

3. 调用 Python 这个类的方法,因为无参数,我一开始没有加括号 --  Delphi 的无参数方法可以不加括号,运行出错。加上括号运行正确。结论:在 Delphi 里面调用 Python 对象的方法,方法有没有参数,都要加上括号。

总结:

1. 首先调用 PythonEngine1.ExecStrings 加载运行有这个 Python 类的 Python 代码;

2. 使用 MainModule.类名()  的方式,直接就创建了 Python 类。在 Delphi 里面,Python 类创建的对象保存到一个 Variant 变量里面。

3. 有了对象,就可以用【对象.方法()】的方式调用这个对象的方法了。这里需要注意,方法有没有参数都要加上括号。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的例子,演示如何在 Delphi调用 Python 编写的 DLL 中的自定义函数: 首先,我们需要有一个 Python 脚本,其中包含我们想要在 Delphi调用的自定义函数。例如,我们可以创建一个名为 `my_module.py` 的文件,其中包含以下代码: ```python def add_numbers(a, b): return a + b ``` 接下来,我们需要使用 Python 的 `ctypes` 模块将该脚本转换为 DLL。我们可以在 Python使用以下代码完成: ```python from ctypes import * # Load the Python DLL python_dll = CDLL("python37.dll") # Load our Python module my_module = python_dll.PyImport_ImportModule("my_module") # Get a reference to our function add_numbers_func = python_dll.PyObject_GetAttrString(my_module, "add_numbers") # Define the argument types for our function add_numbers_func.argtypes = [c_int, c_int] # Define the return type for our function add_numbers_func.restype = c_int # Export our function as a DLL add_numbers_dll = add_numbers_func._as_parameter_ ``` 现在我们已经将 Python 脚本转换为 DLL,并且我们有了对自定义函数的引用。接下来,我们可以在 Delphi 代码使用以下代码调用该函数: ```delphi type TAddNumbersFunc = function(a, b: Integer): Integer; stdcall; var PythonDLL: THandle; AddNumbersFunc: TAddNumbersFunc; ResultValue: Integer; begin // Load the Python DLL PythonDLL := LoadLibrary('my_module.dll'); if PythonDLL = 0 then raise Exception.Create('Failed to load Python DLL'); try // Get a reference to our function @AddNumbersFunc := GetProcAddress(PythonDLL, 'add_numbers'); if not Assigned(AddNumbersFunc) then raise Exception.Create('Failed to get function address'); // Call our function ResultValue := AddNumbersFunc(1, 2); ShowMessageFmt('Result: %d', [ResultValue]); finally FreeLibrary(PythonDLL); end; end; ``` 这个例子演示了如何在 Delphi调用 Python 编写的 DLL 中的自定义函数。需要注意的是,我们在 Delphi使用的函数名必须与 Python使用的函数名相同。此外,我们还需要正确设置参数型和返回型,以便 Delphi 可以正确地调用 Python 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值