【发布时间】:2018-03-17 19:48:11
【问题描述】:
我很难理解这一点。假设我们有一个这样的代码
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,其中__ 是魔术方法。那么如何打印__foodMagic 属性呢?
【问题讨论】:
-
如果你想在类主体之外访问
__food,那么不要使用前导下划线(前导下划线的主要目的是通过名称修改弱“隐藏”变量)。你会发现它是_Animal__food -
@cᴏʟᴅsᴘᴇᴇᴅ,太好了。这就消除了疑问。所以
_Animal也是一种神奇的方法? -
除非您想根据
self.__food计算值,否则您甚至不应该费心定义getFood;让用户直接访问self.food即可。 -
另外,“魔法方法”并不是一个定义完美的术语,但它通常用于像
__init__和__add__这样的方法——两边都有双下划线,而不仅仅是左边——让你的类符合 Python 或 stdlib 使用的“协议”。 -
顺便说一句,双下划线实际上并不是为了向调用者隐藏变量,这样他们就不能故意使用它们,而是向子类隐藏它们,这样他们就不会意外使用它们。
标签: python python-2.7 class getter-setter