@@ -6013,5 +6013,69 @@ class A(metaclass=M):
60136013 pass
60146014
60156015
6016+ class TestGenericDescriptors (unittest .TestCase ):
6017+ def test___dict__ (self ):
6018+ class CustomClass :
6019+ pass
6020+ class SlotClass :
6021+ __slots__ = ['foo' ]
6022+ class SlotSubClass (SlotClass ):
6023+ pass
6024+ class IntSubclass (int ):
6025+ pass
6026+
6027+ dict_descriptor = CustomClass .__dict__ ['__dict__' ]
6028+ self .assertEqual (dict_descriptor .__objclass__ , object )
6029+
6030+ for cls in CustomClass , SlotSubClass , IntSubclass :
6031+ with self .subTest (cls = cls ):
6032+ self .assertIs (cls .__dict__ ['__dict__' ], dict_descriptor )
6033+ instance = cls ()
6034+ instance .attr = 123
6035+ self .assertEqual (
6036+ dict_descriptor .__get__ (instance , cls ),
6037+ {'attr' : 123 },
6038+ )
6039+ with self .assertRaises (AttributeError ):
6040+ print (dict_descriptor .__get__ (True , bool ))
6041+ with self .assertRaises (AttributeError ):
6042+ print (dict_descriptor .__get__ (SlotClass (), SlotClass ))
6043+
6044+ # delegation to type.__dict__
6045+ self .assertIsInstance (
6046+ dict_descriptor .__get__ (type , type ),
6047+ types .MappingProxyType ,
6048+ )
6049+
6050+ def test___weakref__ (self ):
6051+ class CustomClass :
6052+ pass
6053+ class SlotClass :
6054+ __slots__ = ['foo' ]
6055+ class SlotSubClass (SlotClass ):
6056+ pass
6057+ class IntSubclass (int ):
6058+ pass
6059+
6060+ weakref_descriptor = CustomClass .__dict__ ['__weakref__' ]
6061+ self .assertEqual (weakref_descriptor .__objclass__ , object )
6062+
6063+ for cls in CustomClass , SlotSubClass :
6064+ with self .subTest (cls = cls ):
6065+ self .assertIs (cls .__dict__ ['__weakref__' ], weakref_descriptor )
6066+ instance = cls ()
6067+ instance .attr = 123
6068+ self .assertEqual (
6069+ weakref_descriptor .__get__ (instance , cls ),
6070+ None ,
6071+ )
6072+ with self .assertRaises (AttributeError ):
6073+ print (weakref_descriptor .__get__ (True , bool ))
6074+ with self .assertRaises (AttributeError ):
6075+ print (weakref_descriptor .__get__ (SlotClass (), SlotClass ))
6076+ with self .assertRaises (AttributeError ):
6077+ print (weakref_descriptor .__get__ (IntSubclass (), IntSubclass ))
6078+
6079+
60166080if __name__ == "__main__" :
60176081 unittest .main ()
0 commit comments