我很难理解这一点。我们假设我们有一段代码
var a = "gsdgtrshghf";
function reverseString(strr){
if (!strr.length){
var result="";
for(var i=strr.length;i>0;i++){
var a=strr.chatAt(i);
result+=a;
}
}return result;
}
console.log(reverseString(a))
然后我们初始化它
class Animal:
def __init__(self, name, food):
self.name = name
self.__food = food
def getFood(self):
return self.__food
现在,在访问属性时,似乎不允许我访问>>> animal = {}
>>> animal["dog"] = Animal("rusty", "delicious thing you never know")
__food
为什么会失败。我们可以清楚地看到我正在使用>>> animal["dog"].name
'rusty'
>>> animal["dog"].__food
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Animal instance has no attribute '__food'
,其中self.__food = food
是魔法。那么如何打印__
Magic属性?
答案 0 :(得分:4)
添加前导下划线的主要目的是提供类似于&#34;私有变量&#34;在python中。好吧,它们不是完全私有的变量 - python并没有真正提供这种语言功能。解释器会破坏名称,使得(稍微)更难以从课堂外访问这些成员。
您可以在official documentation上阅读更多内容(2.x文档,因为您的问题被标记为此类)。相关摘录 -
由于类私有成员有一个有效的用例(即 避免名字冲突的名称与子类定义的名称,在那里 对这种机制的支持是有限的,称为名称修改。任何
__spam
形式的标识符(至少两个主要下划线,at 大多数一个尾随下划线)在文本上被替换为_classname__spam
,其中classname是当前类名,其中前导下划线被剥离。这种破坏是不加考虑的 到标识符的句法位置,只要它发生 在一个类的定义内。
总结一下,#&#34;私人&#34;变量,例如__x
将是_ClassName__x
。您可以验证您班级的情况:
In [251]: animal['dog']._Animal__food
Out[251]: 'delicious thing you never know'
是的,正如我的评论中提到的那样,私人会员的目的是&#34;是这样的,它可能无法在课外访问。如果您定义此成员的意图是应该在外部访问,那么您甚至不应该添加前导下划线。