Properties 为什么当我';我正在尝试从课堂外访问一个字段?
我开始了解Haxe,我主要是用它来生成Python代码和C#dll 然而,我多次遇到相同的问题:每当我尝试编写getter时,当我从方法内部访问相关属性时,它们工作正常,但当我尝试从类外部访问它们时,它们甚至没有被调用。我开始怀疑我遗漏了一些基本的东西 例如,如果我编写以下类:Properties 为什么当我';我正在尝试从课堂外访问一个字段?,properties,haxe,Properties,Haxe,我开始了解Haxe,我主要是用它来生成Python代码和C#dll 然而,我多次遇到相同的问题:每当我尝试编写getter时,当我从方法内部访问相关属性时,它们工作正常,但当我尝试从类外部访问它们时,它们甚至没有被调用。我开始怀疑我遗漏了一些基本的东西 例如,如果我编写以下类: @:expose @:keep class TestClass { public var testField(get, null):String; private function get_testFi
@:expose
@:keep
class TestClass
{
public var testField(get, null):String;
private function get_testField():String
{
trace("executing getter");
return "testString";
}
public function new() {}
public function testMethod()
{
trace(testField);
}
}
然后在Python中:
testInstance=MyModule.TestClass();
testInstance.testMethod();
…预期的产出:
executing getter
testString
但是
打印(testInstance.testField)
…输出None
我希望testInstance.testField
返回“testString”
在所有情况下,我做错了什么?这也发生在C#中。这是因为并且不生成本机属性。甚至不是所有的目标都有属性,而那些属性很可能不是100%符合Haxe的语义
相反,属性访问被在编译时调用访问器方法(get\u field()
,set\u field()
)代替。因此,
跟踪(testField);
编译为Python时会转换为以下内容:
print(str(self.get\u testField()))
因此,要获得一致的结果,还必须在Python端调用get\u testField()
对于C#和Flash目标,有元数据来生成本机属性(请参见haxe--help metas
):
@:property
-将属性字段标记为编译为本机C#属性(仅限cs)
@:getter
-(类字段名)在给定字段上生成本机getter函数(仅限flash)
@:setter
-(类字段名)在给定字段上生成本机setter函数(仅限flash)
请注意,C#target的@:property
仅适用于没有。在您的示例中,(get,null)
必须替换为(get,never)
,它才能工作
目前还存在一种通过
@:property
在JS目标上支持本机属性的方法。考虑到Python也具有本机属性,这对Python也有意义。也许考虑打开一个问题。p> 非常感谢,这很有道理!