繁体   English   中英

如何在类python中访问魔术方法

[英]How to access Magic Methods inside a Class python

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

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 __是魔术方法。 那么,如何打印__food Magic属性?

添加下划线的主要目的是提供类似于python中的“私有变量”的功能。 好吧,它们不是完全私有变量-python确实没有提供此语言功能。 解释器将修改名称,使(稍微)难以从班级外部访问这些成员。

您可以阅读官方文档 (2.x文档,因为您的问题已被标记)。 相关摘录-

由于存在类专用成员的有效用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为名称处理的机制的支持有限。 形式为__spam任何标识符(至少两个前导下划线,至多一个下划线)在文本上被_classname__spam替换,其中classname是当前的类名,其中前导下划线被去除。 只要不存在标识符的语法位置,就可以进行这种改写,只要它出现在类的定义内即可。

总而言之,“私有”变量的__x版本,例如__x将是_ClassName__x 您可以验证您的班级是否属于这种情况:

In [251]: animal['dog']._Animal__food
Out[251]: 'delicious thing you never know'

是的,所以,正如我在评论中提到的那样,“私人成员”的目的是使它不能在课堂之外访问。 如果您打算定义此成员是为了使它可以在外部访问,则您甚至不应添加前导下划线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM