读写属性
项目描述
- 邮箱:
- 许可证:
Zope公共许可证,v2.1
动机
使用方法装饰器和描述符如property,我们可以轻松创建计算属性
>>> class JamesBrown(object): ... @property ... def feel(self): ... return self._feel
尽管如此,这样的属性是不能写入的。您可能需要这样做
>>> class JamesBrown(object): ... def _getFeel(self): ... return self._feel ... def _setFeel(self, feel): ... self._feel = feel ... feel = property(_getFeel, _setFeel)
这种方法的缺点是它将getter和setter留在类命名空间中。它还缺乏装饰器解决方案的紧凑拼写。为了解决这个问题,有些人喜欢写
>>> class JamesBrown(object): ... @apply ... def feel(): ... def get(self): ... return self._feel ... def set(self, feel): ... self._feel = feel ... return property(get, set)
这种拼写感觉相当笨拙,而且apply在Python 3000中将要消失。
目标
应该有一种方法可以声明一个读写属性,同时仍然使用紧凑且易于使用的装饰器拼写。读写属性应该像只读属性一样易于使用。我们明确不希望立即调用的函数,这个函数实际上只是帮助我们命名属性并为getter和setter创建一个局部作用域。
读写属性
读写属性的工作方式与常规属性类似。您只需定义一个方法,然后应用一个装饰器,只是现在您不使用@property,而是使用@getproperty来标记getter,使用@setproperty来标记setter
>>> from rwproperty import getproperty, setproperty >>> class JamesBrown(object): ... @getproperty ... def feel(self): ... return self._feel ... @setproperty ... def feel(self, feel): ... self._feel = feel>>> i = JamesBrown() >>> i.feel Traceback (most recent call last): ... AttributeError: 'JamesBrown' object has no attribute '_feel'>>> i.feel = "good" >>> i.feel 'good'
声明getter和setter的顺序并不重要
>>> from rwproperty import getproperty, setproperty >>> class JamesBrown(object): ... @setproperty ... def feel(self, feel): ... self._feel = feel ... @getproperty ... def feel(self): ... return self._feel>>> i = JamesBrown() >>> i.feel = "good" >>> i.feel 'good'
当然,也可以有删除器
>>> from rwproperty import delproperty >>> class JamesBrown(object): ... @setproperty ... def feel(self, feel): ... self._feel = feel ... @getproperty ... def feel(self): ... return self._feel ... @delproperty ... def feel(self): ... del self._feel>>> i = JamesBrown() >>> i.feel = "good" >>> del i.feel >>> i.feel Traceback (most recent call last): ... AttributeError: 'JamesBrown' object has no attribute '_feel'
边缘情况
可能存在一种情况,您正在使用某种读写属性,并且已经定义了同名的非属性属性
>>> class JamesBrown(object): ... feel = "good" ... @getproperty ... def feel(self): ... return "so good" ... Traceback (most recent call last): ... TypeError: read & write properties cannot be mixed with other attributes except regular property objects.
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码发行版
rwproperty-1.0.tar.gz (2.9 kB 查看哈希值)
构建发行版
rwproperty-1.0-py2.4.egg (3.9 kB 查看哈希值)
关闭
rwproperty-1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 49742642f2b5e6b0861b35a43ceda2b1aad3c5173dbd6f3e4ce1cb10037f8416 |
|
MD5 | 050bdf066492b3cd82a3399f8efea6b1 |
|
BLAKE2b-256 | 71fce3d922fc07db990f9aa235a2b1c690a167a9403aadc6ac30afb59e7cc0b4 |
关闭
rwproperty-1.0-py2.4.egg的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e50f3fe67bf418de845a5cf95c1695d703d3d84984c31e46a1b301598846cfac |
|
MD5 | 51ed26b228ecf44fe4b6e338ef23f3c5 |
|
BLAKE2b-256 | b56b76cd9560ad57172c1f331d9e9ae58c3f76078fbe35c811661870d5d94de1 |