| # Test case for property | 
 | # more tests are in test_descr | 
 |  | 
 | import unittest | 
 | from test.support import run_unittest | 
 |  | 
 | class PropertyBase(Exception): | 
 |     pass | 
 |  | 
 | class PropertyGet(PropertyBase): | 
 |     pass | 
 |  | 
 | class PropertySet(PropertyBase): | 
 |     pass | 
 |  | 
 | class PropertyDel(PropertyBase): | 
 |     pass | 
 |  | 
 | class BaseClass(object): | 
 |     def __init__(self): | 
 |         self._spam = 5 | 
 |  | 
 |     @property | 
 |     def spam(self): | 
 |         """BaseClass.getter""" | 
 |         return self._spam | 
 |  | 
 |     @spam.setter | 
 |     def spam(self, value): | 
 |         self._spam = value | 
 |  | 
 |     @spam.deleter | 
 |     def spam(self): | 
 |         del self._spam | 
 |  | 
 | class SubClass(BaseClass): | 
 |  | 
 |     @BaseClass.spam.getter | 
 |     def spam(self): | 
 |         """SubClass.getter""" | 
 |         raise PropertyGet(self._spam) | 
 |  | 
 |     @spam.setter | 
 |     def spam(self, value): | 
 |         raise PropertySet(self._spam) | 
 |  | 
 |     @spam.deleter | 
 |     def spam(self): | 
 |         raise PropertyDel(self._spam) | 
 |  | 
 | class PropertyDocBase(object): | 
 |     _spam = 1 | 
 |     def _get_spam(self): | 
 |         return self._spam | 
 |     spam = property(_get_spam, doc="spam spam spam") | 
 |  | 
 | class PropertyDocSub(PropertyDocBase): | 
 |     @PropertyDocBase.spam.getter | 
 |     def spam(self): | 
 |         """The decorator does not use this doc string""" | 
 |         return self._spam | 
 |  | 
 | class PropertyTests(unittest.TestCase): | 
 |     def test_property_decorator_baseclass(self): | 
 |         # see #1620 | 
 |         base = BaseClass() | 
 |         self.assertEqual(base.spam, 5) | 
 |         self.assertEqual(base._spam, 5) | 
 |         base.spam = 10 | 
 |         self.assertEqual(base.spam, 10) | 
 |         self.assertEqual(base._spam, 10) | 
 |         delattr(base, "spam") | 
 |         self.assert_(not hasattr(base, "spam")) | 
 |         self.assert_(not hasattr(base, "_spam")) | 
 |         base.spam = 20 | 
 |         self.assertEqual(base.spam, 20) | 
 |         self.assertEqual(base._spam, 20) | 
 |         self.assertEqual(base.__class__.spam.__doc__, "BaseClass.getter") | 
 |  | 
 |     def test_property_decorator_subclass(self): | 
 |         # see #1620 | 
 |         sub = SubClass() | 
 |         self.assertRaises(PropertyGet, getattr, sub, "spam") | 
 |         self.assertRaises(PropertySet, setattr, sub, "spam", None) | 
 |         self.assertRaises(PropertyDel, delattr, sub, "spam") | 
 |         self.assertEqual(sub.__class__.spam.__doc__, "SubClass.getter") | 
 |  | 
 |     def test_property_decorator_doc(self): | 
 |         base = PropertyDocBase() | 
 |         sub = PropertyDocSub() | 
 |         self.assertEqual(base.__class__.spam.__doc__, "spam spam spam") | 
 |         self.assertEqual(sub.__class__.spam.__doc__, "spam spam spam") | 
 |  | 
 | def test_main(): | 
 |     run_unittest(PropertyTests) | 
 |  | 
 | if __name__ == '__main__': | 
 |     test_main() |