Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何与类一起公开从glm Haxe库导入的类型?_Python_Haxe_Haxelib - Fatal编程技术网

Python 如何与类一起公开从glm Haxe库导入的类型?

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

我正在编写一个类,我将把它翻译成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 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手册中的文章以获得详细解释。