2016-12-06 128 views
0

一些源代碼,如下圖所示:這個源代碼爲什麼有效?

class Flask(object): 
    def __init__(self, value): 
     self.value = value 
    def _get(self): 
     return self.value 
    def _set(self,value): 
     self.value = value 
    name = property(_get, _set) 
    del _get, _set 
app = Flask('abc') 
app.name = 'hello' 

我的問題是,爲什麼這個源代碼塊可以工作。類方法_get,_set被del句子刪除。爲什麼我們也可以使用app.name來調用Flask._set方法?

+1

它真的被刪除了嗎?因爲有些東西有其參考,「del」無能爲力。 –

回答

1

del刪除名稱和內存,如果沒有別的引用它。

既然你做name = property(_get, _set)時複製引用,del有沒有你認爲它的影響(在C++代碼成像強制刪除的災難性後果,例如,這將使Python運行不穩定)

您不能直接(按名稱)訪問_get_set方法,但它們仍在某處引用。

小,更簡單的例子:

l=[3,4,5] 
x=l 
del l 
print(x) 
print(l) 

結果:

[3, 4, 5] # <== x is valid 
Traceback (most recent call last): 
    File "L:\module1.py", line 5, in <module> 
    print(l) 
NameError: name 'l' is not defined 

你看到x至今仍保持着數據。但訪問l提高NameError

1

正如評論說,他們沒有真正刪除,因爲有它們的引用(由酒店舉行),但他們(姓名)從類本身去除,因此寫

app = Flask('abc') 
app._get() 
app._set('foo') 

是不可能的,因爲Flask類不再擁有這些成員。