如何在类python中访问Magic Methods

时间:2018-03-17 19:48:11

标签: python python-2.7 class getter-setter

我很难理解这一点。我们假设我们有一段代码

 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属性?

1 个答案:

答案 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;是这样的,它可能无法在课外访问。如果您定义此成员的意图是应该在外部访问,那么您甚至不应该添加前导下划线。