Properties 为什么当我';我正在尝试从课堂外访问一个字段?

Properties 为什么当我';我正在尝试从课堂外访问一个字段?,properties,haxe,Properties,Haxe,我开始了解Haxe,我主要是用它来生成Python代码和C#dll 然而,我多次遇到相同的问题:每当我尝试编写getter时,当我从方法内部访问相关属性时,它们工作正常,但当我尝试从类外部访问它们时,它们甚至没有被调用。我开始怀疑我遗漏了一些基本的东西 例如,如果我编写以下类: @:expose @:keep class TestClass { public var testField(get, null):String; private function get_testFi

我开始了解Haxe,我主要是用它来生成Python代码和C#dll

然而,我多次遇到相同的问题:每当我尝试编写getter时,当我从方法内部访问相关属性时,它们工作正常,但当我尝试从类外部访问它们时,它们甚至没有被调用。我开始怀疑我遗漏了一些基本的东西

例如,如果我编写以下类:

@: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> 非常感谢,这很有道理!