为什么这个源代码有效?

时间:2016-12-06 08:41:41

标签: python properties

一些源代码如下所示:

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方法?

2 个答案:

答案 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类不再具有这些成员。