我正在编写一个将同时翻译为Python和C#的类。
我的代码使用漂亮的“glm”库。Glm提供了有用的数据类型,例如:Vec3
。
我能让类中的Python和C用户看到Vec3
吗?
换句话说,我可以使用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.")
但是,此测试失败:
importorror:无法导入名称“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
是一个AA>,抽象只存在于编译时。底层类型实际上是一个名为abstract
的类,如果您选中Vec3Base
,您将注意到它“没有正确的构造函数”的原因:
class Vec3Base {
function new() {}
var x:Float;
var y:Float;
var z:Float;
}
您还可以注意到,所有的
Vec3.hx
方法都声明为Vec3
。如果不是这样(您可以通过使用inline
编译来强制这样做),那么Python输出将有一个名为--no-inline
的附加类。它对所有glm__Vec3_Vec3_Impl_
的方法都有静态方法,因为抽象就是这样在幕后工作的:在这一点上,一个好问题是“如果一个成员函数没有内联声明会发生什么”,因为代码显然必须去某个地方。Haxe创建一个私有类,称为实现类,它将所有抽象成员函数作为静态函数,接受底层类型的附加第一个参数
Vec3
。总之,由于
this
是作为一个抽象实现的,所以我认为没有一种方便的方式将其公开给Python或C用户。Haxe生成的代码通常不太适合这样使用。这并不是说根本没有任何机制来促进这一进程。例如,JavaScript和Lua目标有Vec3
type元数据。关于python - 如何与我的类一起公开从glm Haxe lib导入的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48669998/