Read & write properties
Project description
- Email:
- License:
Zope Public License, v2.1
Motivation
Using method decorators and descriptors like property, we can easily create computed attributes:
>>> class JamesBrown(object): ... @property ... def feel(self): ... return self._feel
An attribute like this cannot be written, though. You would have to do something like this:
>>> class JamesBrown(object): ... def _getFeel(self): ... return self._feel ... def _setFeel(self, feel): ... self._feel = feel ... feel = property(_getFeel, _setFeel)
The problem with this approach is that it leaves the getter and setter sitting around in the class namespace. It also lacks the compact spelling of a decorator solution. To cope with that, some people like to write:
>>> class JamesBrown(object): ... @apply ... def feel(): ... def get(self): ... return self._feel ... def set(self, feel): ... self._feel = feel ... return property(get, set)
This spelling feels rather cumbersome, apart from the fact that apply is going to go away in Python 3000.
Goal
There should be a way to declare a read & write property and still use the compact and easy decorator spelling. The read & write properties should be as easy to use as the read-only property. We explicitly don’t want that immediately called function that really just helps us name the attribute and create a local scope for the getter and setter.
Read & write property
Read & write properties work like regular properties. You simply define a method and then apply a decorator, except that you now don’t use @property but @getproperty to mark the getter and @setproperty to mark the 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'
The order in which getters and setters are declared doesn’t matter:
>>> 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'
Of course, deleters are also possible:
>>> 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'
Edge cases
There might be a case where you’re using a flavour of read & write properties and already have a non-property attribute of the same name defined:
>>> 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file rwproperty-1.0.tar.gz
.
File metadata
- Download URL: rwproperty-1.0.tar.gz
- Upload date:
- Size: 2.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 49742642f2b5e6b0861b35a43ceda2b1aad3c5173dbd6f3e4ce1cb10037f8416 |
|
MD5 | 050bdf066492b3cd82a3399f8efea6b1 |
|
BLAKE2b-256 | 71fce3d922fc07db990f9aa235a2b1c690a167a9403aadc6ac30afb59e7cc0b4 |
File details
Details for the file rwproperty-1.0-py2.4.egg
.
File metadata
- Download URL: rwproperty-1.0-py2.4.egg
- Upload date:
- Size: 3.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e50f3fe67bf418de845a5cf95c1695d703d3d84984c31e46a1b301598846cfac |
|
MD5 | 51ed26b228ecf44fe4b6e338ef23f3c5 |
|
BLAKE2b-256 | b56b76cd9560ad57172c1f331d9e9ae58c3f76078fbe35c811661870d5d94de1 |