获取Python对象作为变量
我用的是蟒蛇 我有一个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
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”
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