跳转到主要内容

读写属性

项目描述

作者:

Philipp von Weitershausen

许可证:

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 查看哈希值)

上传时间 源代码

由以下机构支持