先来看getter

第11行,获取调用到该getter的堆栈信息,它将返回一个字典数组,差不多是这个样子的:
内部调用:
[{ "source": "res://Scripts/script.gd", "function": "@_member_setter", "line": 23 }, { "source": "res://Scripts/script.gd", "function": "_ready", "line": 37 }]
外部调用:
[{ "source": "res://Scripts/script.gd", "function": "@_member_getter", "line": 11 }, { "source": "res://Scripts/script.gd", "function": "@member_getter", "line": 5 }, { "source": "res://Scripts/new_script.gd", "function": "_ready", "line": 5 }]
我们可以先看看不同,会在之后的判断部分详细说明
第12行,定义一个标志,用来判断当前的调用者,是外部亦或是内部
第13行,遍历获取到的堆栈信息
第14行和第18行都是判断部分。
我们看回之前获取到的堆栈信息,我们可以发现,内部调用时"source"字段始终指向当前脚本,而外部调用时则包含调用者脚本,因此,我们就有了第14行的判断。
使用get_script().resource_path来获取当前的脚本路径,如果"source"字段不是当前脚本则标记为外部调用。
而第17行,添加了一个条件,如果堆栈信息中的"function"字段包含指定函数则结束遍历,即允许访问。而这里的"@member_getter"则是member属性的getter,也就是说,这里是允许通过member属性来访问_member属性
第19行则是根据标志来截断抛出异常,如果allow_access为false则截断,否则正常返回。