亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是可變陰影?

什么是可變陰影?

慕碼人8056858 2021-09-14 17:42:23
https://stackoverflow.com/a/37657923/8061009指出對于程序:class Parent(object):    i = 5;    def __init__(self):        self.i = 5    def doStuff(self):        print(self.i)class Child(Parent, object):    def __init__(self):        super(Child, self).__init__()        self.i = 7class Main():    def main(self):        m = Child()        print(m.i) #print 7        m.doStuff() #print 7m = Main()m.main()輸出將是:$ python Main.py 77然后將該答案與 Java 中的類似程序進行比較:原因是因為 Java 在 Child 類中的 int i 聲明使 i 成為類范圍變量,而在 Python 子類化中沒有這樣的變量陰影。如果在 Java 的 Child 類中刪除 int i ,它也會打印 7 和 7 。在這種情況下,變量陰影是什么意思?
查看完整描述

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 不同。


查看完整回答
反對 回復 2021-09-14
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

在 Java 中,方法和字段是根本不同的東西,按照完全不同的規則運行。子類只繼承方法;字段特定于聲明它們的類。如果子類聲明的字段與父類中的字段同名,則它們完全不相關;父類的方法繼續訪問父類的版本,子類的方法訪問其版本。這就是所謂的陰影。如果父類真的想讓子類可以使用它的字段,它就必須為它定義 getter/setter 方法。

在 Python 中,沒有這樣的區別 - 方法基本上是其值恰好是一個函數的字段。此外,整個繼承層次結構中的所有字段都存儲在單個命名空間中(通常實現為名為 的 dict 屬性__dict__)。如果孩子和父母對某事使用相同的名稱,則他們必然指的是同一個對象。


查看完整回答
反對 回復 2021-09-14
?
慕無忌1623718

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


查看完整回答
反對 回復 2021-09-14
  • 3 回答
  • 0 關注
  • 255 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號