Python 如何与类一起公开从glm Haxe库导入的类型?
我正在编写一个类,我将把它翻译成Python和C。 我的代码使用了漂亮的“glm”库。Glm提供有用的数据类型,例如:Python 如何与类一起公开从glm Haxe库导入的类型?,python,haxe,haxelib,Python,Haxe,Haxelib,我正在编写一个类,我将把它翻译成Python和C。 我的代码使用了漂亮的“glm”库。Glm提供有用的数据类型,例如:Vec3 我可以让类中的Python和C#用户看到Vec3? 换句话说,我可以使用Vec3数据类型公开公共方法吗 下面是一个示例Haxe代码,其类的公共函数使用Vec3类型: //测试执行: //haxe-main TestGLM1-lib glm-interp //翻译成Python: //haxe-main TestGLM1-python TestGLM1.py-lib gl
Vec3
我可以让类中的Python和C#用户看到Vec3
?
换句话说,我可以使用Vec3
数据类型公开公共方法吗
下面是一个示例Haxe代码,其类的公共函数使用Vec3
类型:
//测试执行:
//haxe-main TestGLM1-lib glm-interp
//翻译成Python:
//haxe-main TestGLM1-python TestGLM1.py-lib glm
//python3测试glm1.py
进口glm.Vec3;
进口glm.Quat;
进口glm.Mat4;
类TestGLM1{
公共职能(新增){
}
静态函数main(){
//我对以3D数据类型作为输入和输出的方法的测试
var t:TestGLM1=新的TestGLM1();
var v1:Vec3=新的Vec3(1,2,3);
var v2:Vec3=新的Vec3(7,8,9);
t、 testVecIO(v1,v2);
跟踪(v1,v2);
}
公共功能测试vecio(vec_-in:Vec3,vec_-out:Vec3){
vec_out.x=vec_in.x+vec_out.x;
vec_out.y=vec_in.y+vec_out.y;
vec_out.z=vec_in.z+vec_out.z;
}
}
我想编写一个Python测试,如下所示:
from TestGLM1 import TestGLM1
from TestGLM1 import glm_Vec3
print("Python Test...")
t = TestGLM1()
v1 = glm_Vec3(1,2,3) # Vec3()
v2 = glm_Vec3(4,5,6) # Vec3()
t.testVecIO(v1, v2)
print(v1, v2)
print("Python done.")
但是,该测试失败:
导入错误:无法导入名称“glm_Vec3”
因为我能在TestGLM1.py
中看到的唯一类是:
class glm_Vec3Base:
_hx_class_name = "glm.Vec3Base"
__slots__ = ("x", "y", "z")
_hx_fields = ["x", "y", "z"]
def __init__(self):
self.z = None
self.y = None
self.x = None
它既有不友好的名称,又没有显示正确的构造函数
有什么建议吗?
谢谢
我在TestGLM1.py中看到的唯一类是glm_Vec3Base
这是因为Vec3
是一个抽象的对象,抽象只存在于编译时。底层类型实际上是一个名为Vec3Base
的类,如果您选中Vec3.hx
,您会注意到为什么它“没有正确的构造函数”:
class-Vec3Base{
函数new(){}
var x:浮动;
变量y:浮动;
var z:浮动;
}
您还可以注意到,Vec3
的所有方法都声明为inline
。如果它们不是(您可以通过使用--no inline
编译来强制执行此操作),您的Python输出将有一个名为glm\uu Vec3\u Vec3\u Impl\ucode>的附加类。它为所有的Vec3
方法提供了静态方法,因为这就是摘要在引擎盖下的工作方式:
这一点上的一个好问题是“如果一个成员函数没有被内联声明会发生什么”,因为代码显然必须去某个地方。Haxe创建一个私有类,称为实现类,该类将所有抽象成员函数作为静态函数,接受基础类型的附加第一个参数this
总之,由于Vec3
是作为一个抽象实现的,我认为没有一种方便的方式将其公开给Python或C#用户。Haxe生成的代码通常不太适合这样使用。这并不是说没有任何机制来促进它。例如,有JavaScript和Lua目标的元数据 谢谢你的详细解释。然而,如果Vec3是抽象的,我只是想知道如何用…=新的Vec3(1,2,3)。据我所知,抽象数据类型无法实例化(至少在Java和C++等其他OO语言中是如此)。Haxe中的抽象类型实际上与Java风格的抽象类无关。查看我链接的Haxe手册中的文章以获得详细解释。