我想教程是不幸(因爲含糊)措詞和由
[d] ATA屬性重寫方法具有相同名稱
它實際上指「數據屬性重寫先前分配的屬性/定義的同名方法屬性,反之亦然:方法屬性覆蓋以前分配/定義的同名數據屬性。「
「Duh」,你可能會認爲「數據屬性也覆蓋了先前分配的數據屬性的同名,那麼有什麼大不了的,爲什麼還要提到?賦值和重新賦值(在引用的教程中稱爲「覆蓋」)與變量(無論是否稱爲「屬性」)完全是命令式編程語言的原型特徵之一。
好,讓我給你介紹
命名空間
Python類的命名空間。那麼本教程可能試圖告訴我們的是,數據屬性和方法屬性在之內的一個類共享一個名稱空間。
不過,對於不同類別的屬性,情況並非如此。如果一個類繼承自另一個類,它可以訪問其父類的名稱。如果名稱在繼承類中用於方法定義或數據分配,則父類會保留原始值。在孩子階級,他們只是暫時被遮蔽。如果從子類中刪除的名字,它也將再次提供接入到同一個名字的父母的屬性:
class A:
x = 111
class B1(A):
x = 123 # Shadows A.x
assert B1.x == 123
del B1.x # But after removing B1's own x attribute ...
assert B1.x == 111 # ... B1.x is just an alias to A.x !
# Shadowing can happen at any time:
class B2(A):
pass
assert B2.x == A.x == 111
B2.x = 5 # shadowing attributes can also be added after the class definition
assert B2.x == 5
assert A.x == 111
del B2.x
assert B2.x == A.x == 111
對比這與重新定義又名重新分配(或「重寫」的教程調用它):
class C:
x = 555
def x(self):
print('I am x')
C().x() # outputs "I am x"
del C.x
print(C.x) # AttributeError: 'C' object has no attribute 'x'
方法C.x()
暫時沒影子數據屬性C.x
。它取代了它,所以當我們刪除該方法時,x
在C
內完全丟失,而不是在該名稱下重新顯示的數據屬性。
多個命名空間
實例化增加了對陰影另一個命名空間,因此另一個機會:
a = A()
assert a.x == 111 # instance namespace includes class namespace
a.x = 1000
assert a.x == 1000
assert A.x == 111 # class attribute unchanged
del a.x
assert a.x == 111 # sees A.x again
事實上,所有的Python(嵌套)命名空間工作方式:封裝,模塊,類,函數和方法,實例對象,內部類,嵌套函數...
當讀取變量時,命名空間層次結構將自下而上地走到名稱被找到。 (讀這裏的意思是找到變量名稱所綁定的值(對象,函數/方法或內置),如果該值是可變的,則也可以用於更改該值。)
On另一方面,在設置(定義或重新定義)變量時,將使用當前名稱空間的名稱:如果名稱已經存在於該名稱空間中(而不是僅從其他名稱空間包含)新創建的名稱,如果它以前不存在。
變量可以遮蔽其他變量...方法和屬性與類和函數都 –