如果沒有 cls,為什么此代碼會失敗。__TEXT 之前
__TEXT = "abcde"
print(__TEXT)
class aaa():
@classmethod
def bbb(cls):
print(__TEXT)
aaa.bbb()
輸出是:
abcde
Traceback (most recent call last):
File "<string>", line 9, in <module>
File "<string>", line 7, in bbb
NameError: name '_aaa__TEXT' is not defined
如果您將 __TEXT 設為類變數并嘗試在沒有類前綴的情況下參考它,如下所示:
class aaa():
__TEXT = "abcde"
@classmethod
def bbb(cls):
print(cls.__TEXT)
print(__TEXT)
x = aaa()
x.bbb()
你得到同樣的錯誤,但它沒有意義:
abcde
Traceback (most recent call last):
File "<string>", line 10, in <module>
File "<string>", line 7, in bbb
NameError: name '_aaa__TEXT' is not defined
uj5u.com熱心網友回復:
不太確定這是否是錯誤,但你可以讓函式需要一個引數文本,這似乎作業得很好。不過,您需要給我更多資訊,以便我可以嘗試提供幫助。
__TEXT = "abcde"
print(__TEXT)
class aaa():
@classmethod
def bbb(self, __TEXT):
print(__TEXT)
aaa.bbb(__TEXT)
uj5u.com熱心網友回復:
雙下劃線前綴會導致 Python 解釋器重寫屬性名稱,以避免子類中的命名沖突。
這也稱為“名稱修改”。解釋器更改變數名稱的方式使得以后擴展類時更難產生沖突。
參考檔案:https ://docs.python.org/3/tutorial/classes.html#private-variables
uj5u.com熱心網友回復:
Python 解釋器 使用雙下劃線修飾變數名, 以避免名稱與子類定義的變數名沖突。
這背后的目標幾乎等同于 Java 中的 final 變數和 C 中的非虛擬變數。
舉個例子:
class Human:
def __init__(self):
self.surname = 'Jeffrey'
self._age = 22
self.__id = 5
# Let's check the variables associated with this class
x = Human()
print(dir(x)) # gives: ['_Human__id', ..., '_age', 'name']
# Create a subclass 'Cook'
class Cook(Human):
def __init__(self):
Human.__init__(self)
self.__id = 25
y = Cook()
print(dir(y)) # gives: ['_Human__id', '_Cook__id', ..., '_age', 'name']
uj5u.com熱心網友回復:
在PEP 8中,他們特別說:
__double_leading_underscore:命名類屬性時,呼叫名稱修改(在類 FooBar 中,__boo 變為 _FooBar__boo ...)。
注意粗體字的選擇。在他們提請注意重整在命名類屬性中的使用的完全相同的句子中,他們指出重整發生在類的任何 __boo內部,這完美地解釋了您所觀察到的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429754.html
