簡體   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