3 回答

TA貢獻1806條經驗 獲得超5個贊
在這種情況下,變量陰影是什么意思?
變量陰影在所有情況下都意味著相同的事情,與上下文無關。它被定義為一個變量“隱藏”了另一個同名變量。因此,當發生變量遮蔽時,有兩個或多個同名變量,它們的定義取決于它們的作用域(意味著它們的值可能因作用域而異)??焖偈纠?/p>
In [11]: def shadowing():
...: x = 1
...: def inner():
...: x = 2
...: print(x)
...: inner()
...: print(x)
...:
In [12]: shadowing()
2
1
請注意,我們inner()首先調用,它指定x為2,并按此打印2。但是,這并不改變x在外部范圍(即,第一x),由于x在inner被遮蔽的第一x。因此,在我們調用inner()并且調用返回之后,現在第一個x返回到作用域中,因此最后一個打印輸出1。
在這個特定示例中,您引用的原作者說沒有發生陰影(并且要清楚:沒有發生在實例級別)。你會注意到,i在父呈現相同的值作為i在這個孩子。如果發生陰影,它們將具有不同的值,如上面的示例(即父級將擁有一個變量的副本,i而子級將擁有一個也名為 的變量的不同副本i)。然而,他們沒有。i是7在雙方家長和孩子。原作者指出 Python 的繼承機制在這方面與 Java 不同。

TA貢獻1803條經驗 獲得超3個贊
在 Java 中,方法和字段是根本不同的東西,按照完全不同的規則運行。子類只繼承方法;字段特定于聲明它們的類。如果子類聲明的字段與父類中的字段同名,則它們完全不相關;父類的方法繼續訪問父類的版本,子類的方法訪問其版本。這就是所謂的陰影。如果父類真的想讓子類可以使用它的字段,它就必須為它定義 getter/setter 方法。
在 Python 中,沒有這樣的區別 - 方法基本上是其值恰好是一個函數的字段。此外,整個繼承層次結構中的所有字段都存儲在單個命名空間中(通常實現為名為 的 dict 屬性__dict__
)。如果孩子和父母對某事使用相同的名稱,則他們必然指的是同一個對象。

TA貢獻1744條經驗 獲得超4個贊
當在特定范圍(決策塊、方法或內部類)內聲明的變量與在外部范圍內聲明的變量具有相同名稱時,就會發生變量陰影。然后,您所在作用域中的變量會隱藏(隱藏/屏蔽)外部作用域中的變量。
在上面的代碼中,變量i在超類和子類中都被初始化。所以超類中的初始化會被子類和類中的初始化所掩蓋。
m = Child() #we initialized the child class with i=7
print(m.i) #eventhough we are calling a method in the super class the value of i in the super class is shadowed by the value we initialized the instance of the child class (m)
m.doStuff() #same thing here
添加回答
舉報