[Python-Dev] The decorator(s) module (original) (raw)
Duncan Booth duncan.booth at suttoncourtenay.org.uk
Sat Feb 11 14:29:07 CET 2006
- Previous message: [Python-Dev] The decorator(s) module
- Next message: [Python-Dev] The decorator(s) module
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Georg Brandl <g.brandl at gmx.net> wrote in news:dsj0p7$tk3$1 at sea.gmane.org:
Unfortunately, a @property decorator is impossible...
It all depends what you want (and whether you want the implementation to be portable to other Python implementations). Here's one possible but not exactly portable example:
from inspect import getouterframes, currentframe import unittest
class property(property): @classmethod def get(cls, f): locals = getouterframes(currentframe())[1][0].f_locals prop = locals.get(f.name, property()) return cls(f, prop.fset, prop.fdel, prop.doc)
@classmethod
def set(cls, f):
locals = getouterframes(currentframe())[1][0].f_locals
prop = locals.get(f.__name__, property())
return cls(prop.fget, f, prop.fdel, prop.__doc__)
@classmethod
def delete(cls, f):
locals = getouterframes(currentframe())[1][0].f_locals
prop = locals.get(f.__name__, property())
return cls(prop.fget, prop.fset, f, prop.__doc__)
class PropTests(unittest.TestCase): def test_setgetdel(self): class C(object): def init(self, colour): self._colour = colour
@property.set
def colour(self, value):
self._colour = value
@property.get
def colour(self):
return self._colour
@property.delete
def colour(self):
self._colour = 'none'
inst = C('red')
self.assertEquals(inst.colour, 'red')
inst.colour = 'green'
self.assertEquals(inst._colour, 'green')
del inst.colour
self.assertEquals(inst._colour, 'none')
if name=='main': unittest.main()
- Previous message: [Python-Dev] The decorator(s) module
- Next message: [Python-Dev] The decorator(s) module
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]