@@ -6013,5 +6013,69 @@ class A(metaclass=M):
6013
6013
pass
6014
6014
6015
6015
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
+
6016
6080
if __name__ == "__main__" :
6017
6081
unittest .main ()
0 commit comments