Minor annoyances with properties
eb303
eric.brunel.pragmadev at gmail.com
Fri May 28 11:01:29 EDT 2010
On May 28, 11:50 am, Christian Heimes <li... at cheimes.de> wrote:
> Am 28.05.2010 11:31, schrieb eb303:
>
>
>
> > On May 27, 3:24 pm, Christian Heimes <li... at cheimes.de> wrote:
> >>> Do I miss something?
> >>> Is this the way to do it, or is there a better one?
>
> >> A better way was introduced in Python 2.6. Seehttp://docs.python.org/library/functions.html?highlight=property#prop...
> >> I have a Python only version around if you are still using Python 2.5.
>
> >> Christian
>
> > Mmmm, I might still miss something. OK, I can replace my initial
> > property using @property and @p.setter, but it doesn't seem to work in
> > subclasses:
>
> > class A(object):
> > @property
> > def p(self):
> > return self._p
> > @p.setter
> > def _set_p(self, p):
> > self._p = p
> > class B(A):
> > @p.setter
> > def _set_p(self, p):
> > …
>
> > results in:
>
> > Traceback (most recent call last):
> > File "toto.py", line 8, in <module>
> > class B(A):
> > File "toto.py", line 9, in B
> > @p.setter
> > NameError: name 'p' is not defined
>
> It doesn't work because "p" is not in the scope of B's body while B is
> created. You have to write
>
> class B(A):
> # access the "p" property from class A
> @A.p.setter
> def p(self, p):
> pass
>
> # once p is in the class body scope, you must not use A.p again
> @p.deleter
> def p(self):
> pass
>
> Christian
Well, I still have to explicitely specify the superclass's name then,
so IMHO it's not a big improvement over repeating:
p = property(A._get_p, _set_p)
Thanks anyway…
- Eric -
More information about the Python-list
mailing list