Properties 是";“可变点特性”;构造(var.property)只是访问器的语法糖?

Properties 是";“可变点特性”;构造(var.property)只是访问器的语法糖?,properties,accessor,godot,gdscript,Properties,Accessor,Godot,Gdscript,这是这个问题的后续问题: 在本文件中,规定: 当您使用该属性时,您使用的是getter和setter方法。该属性便于语言绑定。因此,我们也可以说您不需要该属性,只需要getter和setter 但以下实验似乎与这一点相矛盾: 文件src/PositiveInteger.gd 使用setter,该setter防止将负整数分配给属性n class_name PositiveInteger var n: int func _init() -> void: self.n = 0

这是这个问题的后续问题:

在本文件中,规定:

当您使用该属性时,您使用的是getter和setter方法。该属性便于语言绑定。因此,我们也可以说您不需要该属性,只需要getter和setter


但以下实验似乎与这一点相矛盾:

文件
src/PositiveInteger.gd
使用setter,该setter防止将负整数分配给属性
n

class_name PositiveInteger

var n: int 

func _init() -> void:
    self.n = 0
    
func set_n(_n: int) -> void:
    if _n < 0:
        n = 0
    else:
        n = _n

func get_n() -> int:
    return n

输出为:
<> P>属性分配似乎绕过SETER,这种行为与语言的核心类不同吗?

< P>我前面的答案适用于核心类(并且应该适用于模块类),这些类是用C++编写的。默认情况下,它们不公开任何内容。相反,他们必须将C++方法绑定为方法和属性来公开它们。

现在,如果您希望在GDScript中创建的类具有类似的功能,您可以使用:

tool

extends EditorScript
tool

extends EditorScript

func _run() -> void:
    var PositiveInteger = load("res://src/PositiveInteger.gd")
    var c1 = PositiveInteger.new()
    c1.set_n(-3)
    print("c1: " + str(c1.n))
    var c2 = PositiveInteger.new()
    c2.n = -3
    print("c2: " + str(c2.n))
c1: 0
c2: -3
class_name PositiveInteger

var n: int setget set_n, get_n

func _init() -> void:
    self.n = 0
    
func set_n(_n: int) -> void:
    if _n < 0:
        n = 0
    else:
        n = _n

func get_n() -> int:
    return n
0
0