我正在编辑一个博客文章,并在我的自动完成提示建议一个名为property
的完成时开始输入单词new Property
,对此我一直感到好奇,发现它来自Python自动完成功能包。
我按了它,此代码出现了:
def foo():
doc = "The property."
def fget(self):
return self._
def fset(self, value):
self._ = value
def fdel(self):
del self._
return locals()
= property(**())
我在光标所在的位置键入了Grape
,所以我最终得到了这一点:
def Grape():
doc = "The Grape property."
def fget(self):
return self._Grape
def fset(self, value):
self._Grape = value
def fdel(self):
del self._Grape
return locals()
Grape = property(**Grape())
通过查看代码,我可以看到它正在创建一个名为doc
的局部变量,但似乎并没有对其进行任何操作。
它还创建了三个函数,一个函数返回self._Grape
,另一个函数向self._Grape
添加新属性,而另一个函数删除self._Grape
。
self
和_Grape
来自哪里?这是某种类吗,例如“伪类” ?
在何处,为何以及如何使用“新属性” ?
答案 0 :(得分:1)
您的编辑器提供了一种不同寻常的方式来创建属性。 Here是有关属性的一些信息。
阅读完这些内容后,您将意识到无需在函数内创建getter和setter。编辑器以这种方式执行此操作的原因在于,它具有一个范围,可以在其中定义getter和setter的名称而无需唯一的名称。 IOW,名称隐藏在函数中。
那么,如何将函数(fget,fset,fdel和doc)中定义的对象传递给属性descriptor?
请注意,该函数返回locals的结果。因此,该函数的返回值为dict
,其中本地对象的名称为键,而本地对象的值为值。
最后,对于self
,fget,fset和fdel将被执行,就好像它们是具有该属性的对象的方法一样,因此self
引用该对象。