| 1105 | |
| 1106 | @support.thread_unsafe |
| 1107 | def test_slots(self): |
| 1108 | # Testing __slots__... |
| 1109 | class C0(object): |
| 1110 | __slots__ = [] |
| 1111 | x = C0() |
| 1112 | self.assertNotHasAttr(x, "__dict__") |
| 1113 | self.assertNotHasAttr(x, "foo") |
| 1114 | |
| 1115 | class C1(object): |
| 1116 | __slots__ = ['a'] |
| 1117 | x = C1() |
| 1118 | self.assertNotHasAttr(x, "__dict__") |
| 1119 | self.assertNotHasAttr(x, "a") |
| 1120 | x.a = 1 |
| 1121 | self.assertEqual(x.a, 1) |
| 1122 | x.a = None |
| 1123 | self.assertEqual(x.a, None) |
| 1124 | del x.a |
| 1125 | self.assertNotHasAttr(x, "a") |
| 1126 | |
| 1127 | class C3(object): |
| 1128 | __slots__ = ['a', 'b', 'c'] |
| 1129 | x = C3() |
| 1130 | self.assertNotHasAttr(x, "__dict__") |
| 1131 | self.assertNotHasAttr(x, 'a') |
| 1132 | self.assertNotHasAttr(x, 'b') |
| 1133 | self.assertNotHasAttr(x, 'c') |
| 1134 | x.a = 1 |
| 1135 | x.b = 2 |
| 1136 | x.c = 3 |
| 1137 | self.assertEqual(x.a, 1) |
| 1138 | self.assertEqual(x.b, 2) |
| 1139 | self.assertEqual(x.c, 3) |
| 1140 | |
| 1141 | class C4(object): |
| 1142 | """Validate name mangling""" |
| 1143 | __slots__ = ['__a'] |
| 1144 | def __init__(self, value): |
| 1145 | self.__a = value |
| 1146 | def get(self): |
| 1147 | return self.__a |
| 1148 | x = C4(5) |
| 1149 | self.assertNotHasAttr(x, '__dict__') |
| 1150 | self.assertNotHasAttr(x, '__a') |
| 1151 | self.assertEqual(x.get(), 5) |
| 1152 | try: |
| 1153 | x.__a = 6 |
| 1154 | except AttributeError: |
| 1155 | pass |
| 1156 | else: |
| 1157 | self.fail("Double underscored names not mangled") |
| 1158 | |
| 1159 | # Make sure slot names are proper identifiers |
| 1160 | try: |
| 1161 | class C(object): |
| 1162 | __slots__ = [None] |
| 1163 | except TypeError: |
| 1164 | pass |