获取Python对象作为变量

获取Python对象作为变量,python,class,delphi,python4delphi,Python,Class,Delphi,Python4delphi,我用的是蟒蛇 我有一个python文件,上面声明了一个类,如下所示: class Student: SName = "MyName" SAge = 26 def GetName(self): return SName def GetAge(self): return SAge var PObj : PPyObject; begin ... PObj := GetPythonEngine.PyObject_GetAttrString(FMyPythonO

我用的是蟒蛇

我有一个python文件,上面声明了一个类,如下所示:

class Student:
  SName = "MyName"
  SAge = 26

  def GetName(self):
    return SName

  def GetAge(self):
    return SAge
var
 PObj : PPyObject;
begin
 ...
 PObj := GetPythonEngine.PyObject_GetAttrString(FMyPythonObject, PAnsiChar(WideStringToString('AttrName', 0)));
 AttrValueEdit.Text := GetPythonEngine.PyObjectAsString(PObj);
 ...
end
我想获得这个类的引用,并用我的Delphi代码访问它的字段或方法

我在这里找到了一个例子:

但是,当我尝试这样做时,会显示一个错误: “不支持此类接口”

这是我的Delphi代码:

var
 Err : Boolean;
 S : TStringList;
 MyClass : OLEVariant;
 PObj : PPyObject;
begin
 ...

 S := TStringList.Create;
 try
  S.LoadFromFile(ClassFileEdit.Text);
  Err := False;
  try
   PyEngine.ExecStrings(S);
  except
   on E:Exception do
    begin
     Err := True;

     MessageBox(Handle, PChar('Load Error : ' + #13 + E.Message), '', MB_OK+MB_ICONEXCLAMATION);
    end;
  end;
 finally
  S.Free;
 end;

 if Err then
  Exit;

 Err := False;
 try
  try
   PyEngine.ExecString('ClassVar.Value = Student()');
  except
   on E:Exception do
    begin
     Err := True;

     MessageBox(Handle, PChar('Class Name Error : ' + #13 + E.Message), '', MB_OK+MB_ICONEXCLAMATION);
    end;
  end;
 finally
  if not Err then
   begin
    PObj := ClassDelphiVar.ValueObject;
    MyClass := GetAtom(PObj);
    GetPythonEngine.Py_XDECREF(PObj);

    NameEdit.Text := MyClass.GetName();
    AgeEdit.Text := IntToStr(MyClass.GetAge());
   end;
 end;
此行出现错误:

NameEdit.Text := MyClass.GetName();
我的班级似乎没有填满学生对象

我搜索了很多,发现GetAtom在新版本中不受欢迎,但我怎么能用另一种方式做到这一点呢

  • ClassDelphiVar是一个TPythonDelphiVar组件,变量名为“ClassVar”

我找到了答案,我将在这里发布,可能对某人有所帮助

在表单上放置一个PythonDelphiVar组件,并将其设置为
OnExtGetData
OnExtSetData
事件,如以下代码:

procedure TMainFrm.ClassDelphiVarExtGetData(Sender: TObject;
  var Data: PPyObject);
begin
 with GetPythonEngine do
   begin
     Data := FMyPythonObject;
     Py_XIncRef(Data); // This is very important
   end;
end;

procedure TMainFrm.ClassDelphiVarExtSetData(Sender: TObject; Data: PPyObject);
begin
 with GetPythonEngine do
  begin
   Py_XDecRef(FMyPythonObject); // This is very important
   FMyPythonObject := Data;
   Py_XIncRef(FMyPythonObject); // This is very important
  end;
end;
我们应该注意Python对象的引用计数

在窗体类的公共部分中声明为PPyObject变量的FMyPythonObject

现在,如果我们在Python模块中运行此脚本:

ClassVar.Value = MyClass()
ClassVar
是PythonDelphiVar组件的VarName)

然后我们可以获得Python对象的属性,如下所示:

class Student:
  SName = "MyName"
  SAge = 26

  def GetName(self):
    return SName

  def GetAge(self):
    return SAge
var
 PObj : PPyObject;
begin
 ...
 PObj := GetPythonEngine.PyObject_GetAttrString(FMyPythonObject, PAnsiChar(WideStringToString('AttrName', 0)));
 AttrValueEdit.Text := GetPythonEngine.PyObjectAsString(PObj);
 ...
end