我正在写一个我将翻译成Python和C#的类。
我的代码使用了很好的" glm"图书馆。 Glm提供了有用的数据类型,例如:Vec3
。
我可以让Vec3
对我班级的Python和C#用户可见吗?
换句话说,我可以使用Vec3
数据类型公开公共方法吗?
以下是一个示例Haxe代码,其中一个类的公共函数使用Vec3
类型:
// Test execution:
// haxe -main TestGLM1 -lib glm --interp
// Translate into Python:
// haxe -main TestGLM1 -python TestGLM1.py -lib glm
// python3 TestGLM1.py
import glm.Vec3;
import glm.Quat;
import glm.Mat4;
class TestGLM1 {
public function new() {
}
static function main() {
// My test of the method taking 3D datatypes as input and output
var t: TestGLM1 = new TestGLM1() ;
var v1: Vec3 = new Vec3(1,2,3) ;
var v2: Vec3 = new Vec3(7,8,9) ;
t.testVecIO(v1, v2);
trace(v1, v2);
}
public function testVecIO(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.")
但是,此测试失败了:
ImportError:无法导入名称' 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
既有不友好的名字,也没有显示正确的构造函数。
有什么建议吗? 感谢。
答案 0 :(得分:2)
我在TestGLM1.py中可以看到的唯一一个类是glm_Vec3Base
那是因为Vec3
是abstract
type,而摘要仅在编译时存在。基础类型确实是一个名为Vec3Base
的类,如果你检查Vec3.hx
,你会注意到它为什么没有一个合适的构造函数":
class Vec3Base {
function new() {}
var x:Float;
var y:Float;
var z:Float;
}
您还可以注意到,Vec3
的所有方法都声明为inline
。如果它们不是(您可以通过使用--no-inline
进行编译来强制执行此操作),则您的Python输出将具有另一个名为glm__Vec3_Vec3_Impl_
的类。它具有适用于所有Vec3
方法的静态方法,因为它是抽象的工作方式:
此时一个很好的问题是"如果成员函数未被内联声明会发生什么?#34;因为代码显然必须去某个地方。 Haxe创建了一个私有类,称为实现类,它将所有抽象成员函数作为静态函数接受基础类型的附加第一个参数
this
。
总之,由于Vec3
被实现为摘要,我不认为有一种方便的方式将其公开给Python或C#用户。 Haxe生成的代码通常不适合像这样使用。这并不是说根本没有促进它的机制。例如,有JavaScript和Lua目标的@:expose
元数据。