One-Shot Property?
Terry Hancock
hancock at anansispaceworks.com
Fri Jan 28 10:35:02 EST 2005
On Tuesday 18 January 2005 12:33 pm, John Lenton wrote:
>
> consider this:
>
> 1 >>> class C:
> 2 ... x = property(str)
> 3 ...
> 4 >>> c = C()
> 5 >>> c.x
> 6 '<__main__.C instance at 0x4008d92c>'
> 7 >>> setattr(c, 'x', c.x)
> 8 >>> c.x
> 9 '<__main__.C instance at 0x4008d92c>'
> 10 >>> C.x
> 11 <property object at 0x4009a7ac>
> 12 >>> c.x = 2
> 13 >>>
>
> in line 5 you see that the x property so defined works. In line 7 you
> remove it, replacing it with the computed value of the property. Line
> 9 shows that it worked, line 11 shows that it didn't break the class,
> and line 13 (through the absence of an exception) shows that it no
> longer is 'special' (as it shouldn't be).
It wasn't "special" before, either -- I tried this myself, because I wasn't
familiar with properties yet, and I was trying to figure out what you
meant by that.
The catch is that I think you meant to type:
> 1 >>> class C(object):
(i.e. so that C is a "new-style" class).
Then we get "special" behavior (which answers my first question):
>>> class C(object):
... x = property(str)
...
>>> C.x
<property object at 0x401e8cd4>
>>> c = C()
>>> c.x
'<__main__.C object at 0x401e984c>'
>>> c.x = 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: can't set attribute
>>>
Unfortunately this seems to break your technique, too:
>>> setattr(c, 'x', c.x)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: can't set attribute
Too bad. I was kind of hoping it was just a typo. :-(
Unless I'm missing something, anyway.
Cheers,
Terry
--
--
Terry Hancock ( hancock at anansispaceworks.com )
Anansi Spaceworks http://www.anansispaceworks.com
More information about the Python-list
mailing list