Are Python properties broken?
Are Python properties broken?
How can it be that this test case
import unittest
class PropTest(unittest.TestCase):
def test(self):
class C():
val = 'initial val'
def get_p(self):
return self.val
def set_p(self, prop):
if prop == 'legal val':
self.val = prop
prop=property(fget=get_p, fset=set_p)
c=C()
self.assertEqual('initial val', c.prop)
c.prop='legal val'
self.assertEqual('legal val', c.prop)
c.prop='illegal val'
self.assertNotEqual('illegal val', c.prop)
fails as below?
Failure
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 279, in run
testMethod()
File "/Users/jacob/aau/admissions_proj/admissions/plain_old_unit_tests.py", line 24, in test
self.assertNotEqual('illegal val', c.prop)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 358, in failIfEqual
(msg or '%r == %r' % (first, second))
AssertionError: 'illegal val' == 'illegal val'
This is a legitimate criticism that the error message sucks when you try to use
property
but forgot new-style class/must inherit from Object
. IDEs could catch this one.– smci
Aug 13 '12 at 19:23
property
Object
1 Answer
1
Your class C
does not inherit from object
or any other new-style class, so it is an old-style class (and therefore does not support properties). Descriptors are for new-style classes only. To fix, change class C()
to class C(object)
.
C
object
class C()
class C(object)
http://www.python.org/download/releases/2.2.3/descrintro/ provides some details, if you are interested. New-style classes are better in several ways.
Thanks Mike. That was fast. I had just stumbled on the same answer here as well: stackoverflow.com/questions/2240351/…
– Jacob
Mar 17 '10 at 3:26
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Duplicate: stackoverflow.com/questions/2240351/…
– Roger Pate
Mar 17 '10 at 4:07