我想了解内置函数 property
是如何工作的。令我困惑的是 property
也可以用作装饰器,但它只在用作内置函数时才带参数,用作装饰器时不带参数。
此示例来自 文档:
class C:
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
property
setx
delx
参数为 getx
在下面的代码中 property
被用作装饰器。它的对象是 x
函数,但在上面的代码中,参数中没有对象函数的位置。
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
在这种情况下如何创建 x.setter
和 x.deleter
装饰器?
原文由 ashim 发布,翻译遵循 CC BY-SA 4.0 许可协议
property()
函数返回一个特殊的 描述符对象:这个对象有 额外的 方法:
这些 也 充当装饰器。他们返回一个新的属性对象:
那是旧对象的副本,但替换了其中一个功能。
请记住,
@decorator
语法只是语法糖;语法:真的意味着同样的事情
所以
foo
函数被替换为property(foo)
,我们在上面看到的是一个特殊的对象。然后,当您使用@foo.setter()
时,您正在做的是调用property().setter
上面展示的方法,它返回属性的新副本,但这次将 setter 函数替换为装饰的方法。以下序列还通过使用这些装饰器方法创建了一个完整的属性。
首先我们创建一些函数和一个
property
对象,只有一个 getter:接下来我们使用
.setter()
方法添加一个setter:最后我们使用
.deleter()
方法添加一个删除器:Last but not least, the
property
object acts as a descriptor object , so it has.__get__()
,.__set__()
and.__delete__()
methods to hook into实例属性的获取、设置和删除:Descriptor Howto 包括
property()
类型的 纯 Python 示例实现: