一些源代码如下所示:
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
方法?
答案 0 :(得分:1)
UIContainerView
会删除名称和内存(如果没有其他内容引用它)。
由于您在执行del
时复制了引用,因此name = property(_get, _set)
没有您相信它具有的效果(映像强制删除的灾难性影响,例如在C ++代码中)。这会使python运行时不稳定)
您无法直接(按名称)访问del
和_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
答案 1 :(得分:1)
正如评论所说,它们并没有被真正删除,因为它们有对它们的引用(由属性持有)但它们(作为名称)从类本身中删除,因此写作
app = Flask('abc')
app._get()
app._set('foo')
是不可能的,因为Flask类不再具有这些成员。