@@ -1329,18 +1329,17 @@ class D(object):
13291329 self .assertNotHasAttr (a , "__weakref__" )
13301330 a .foo = 42
13311331 self .assertEqual (a .__dict__ , {"foo" : 42 })
1332+ with self .assertRaises (TypeError ):
1333+ weakref .ref (a )
13321334
13331335 class W (object ):
13341336 __slots__ = ["__weakref__" ]
13351337 a = W ()
13361338 self .assertHasAttr (a , "__weakref__" )
13371339 self .assertNotHasAttr (a , "__dict__" )
1338- try :
1340+ with self . assertRaises ( AttributeError ) :
13391341 a .foo = 42
1340- except AttributeError :
1341- pass
1342- else :
1343- self .fail ("shouldn't be allowed to set a.foo" )
1342+ self .assertIs (weakref .ref (a )(), a )
13441343
13451344 class C1 (W , D ):
13461345 __slots__ = []
@@ -1349,6 +1348,7 @@ class C1(W, D):
13491348 self .assertHasAttr (a , "__weakref__" )
13501349 a .foo = 42
13511350 self .assertEqual (a .__dict__ , {"foo" : 42 })
1351+ self .assertIs (weakref .ref (a )(), a )
13521352
13531353 class C2 (D , W ):
13541354 __slots__ = []
@@ -1357,6 +1357,62 @@ class C2(D, W):
13571357 self .assertHasAttr (a , "__weakref__" )
13581358 a .foo = 42
13591359 self .assertEqual (a .__dict__ , {"foo" : 42 })
1360+ self .assertIs (weakref .ref (a )(), a )
1361+
1362+ @unittest .skipIf (_testcapi is None , 'need the _testcapi module' )
1363+ def test_slots_special_before_items (self ):
1364+ class D (_testcapi .HeapCCollection ):
1365+ __slots__ = ["__dict__" ]
1366+ a = D (1 , 2 , 3 )
1367+ self .assertHasAttr (a , "__dict__" )
1368+ self .assertNotHasAttr (a , "__weakref__" )
1369+ a .foo = 42
1370+ self .assertEqual (a .__dict__ , {"foo" : 42 })
1371+ with self .assertRaises (TypeError ):
1372+ weakref .ref (a )
1373+ del a .__dict__
1374+ self .assertNotHasAttr (a , "foo" )
1375+ self .assertEqual (a .__dict__ , {})
1376+ self .assertEqual (list (a ), [1 , 2 , 3 ])
1377+
1378+ class W (_testcapi .HeapCCollection ):
1379+ __slots__ = ["__weakref__" ]
1380+ a = W (1 , 2 , 3 )
1381+ self .assertHasAttr (a , "__weakref__" )
1382+ self .assertNotHasAttr (a , "__dict__" )
1383+ with self .assertRaises (AttributeError ):
1384+ a .foo = 42
1385+ self .assertIs (weakref .ref (a )(), a )
1386+
1387+ @support .subTests (('base' , 'arg' ), [
1388+ (tuple , (1 , 2 , 3 )),
1389+ (int , 9876543210 ** 2 ),
1390+ (bytes , b'ab' ),
1391+ ])
1392+ def test_slots_special_after_items (self , base , arg ):
1393+ class D (base ):
1394+ __slots__ = ["__dict__" ]
1395+ a = D (arg )
1396+ self .assertHasAttr (a , "__dict__" )
1397+ self .assertNotHasAttr (a , "__weakref__" )
1398+ a .foo = 42
1399+ self .assertEqual (a .__dict__ , {"foo" : 42 })
1400+ with self .assertRaises (TypeError ):
1401+ weakref .ref (a )
1402+ del a .__dict__
1403+ self .assertNotHasAttr (a , "foo" )
1404+ self .assertEqual (a .__dict__ , {})
1405+ self .assertEqual (a , base (arg ))
1406+
1407+ class W (base ):
1408+ __slots__ = ["__weakref__" ]
1409+ a = W (arg )
1410+ self .assertHasAttr (a , "__weakref__" )
1411+ self .assertNotHasAttr (a , "__dict__" )
1412+ with self .assertRaises (AttributeError ):
1413+ a .foo = 42
1414+ self .assertIs (weakref .ref (a )(), a )
1415+ self .assertEqual (a , base (arg ))
13601416
13611417 def test_slots_special2 (self ):
13621418 # Testing __qualname__ and __classcell__ in __slots__
0 commit comments