![](/img/trans.png)
[英]How to access class variable inside methods of that class in 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.