2016-12-06 99 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类不再拥有这些成员。

相关问题