为什么这个源代码可以工作?

2024-03-29 15:00:35 发布

您现在位置:Python中文网/ 问答频道 /正文

一些源代码如下:

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'

我的问题是为什么这个源代码块可以工作。类方法\u get,\u set被del语句删除。为什么我们也可以使用应用程序名称调用Flask._set方法?你知道吗


Tags: 方法nameselfappflaskgetreturnobject
2条回答

del删除名称和内存(如果没有其他引用)。你知道吗

既然在^ {< CD2>}时复制引用,^ {< CD1>}没有效果,您相信它已经(例如)在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

正如注释所说,它们并没有被真正删除,因为存在对它们的引用(由属性持有),但是它们(作为名称)被从类本身删除,因此

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

不可能,因为Flask类不再具有这些成员。你知道吗

相关问题 更多 >