@@ -180,3 +180,48 @@ def test_descr_call_with_none():
180
180
assert None .__class__ is type (None )
181
181
assert descr .__get__ (None , type (None )) is descr
182
182
assert_raises (TypeError , descr .__get__ , None , None )
183
+
184
+ def test_custom_getattribute ():
185
+ class AAA :
186
+ __slots__ = '__wrapped__'
187
+
188
+ def __init__ (self , wrapped ):
189
+ object .__setattr__ (self , '__wrapped__' , wrapped )
190
+
191
+ def __index__ (self ):
192
+ return self .__wrapped__ .__index__ ()
193
+
194
+ def __len__ (self ):
195
+ return len (self .__wrapped__ )
196
+
197
+ def __contains__ (self , value ):
198
+ return value in self .__wrapped__
199
+
200
+ def __getitem__ (self , key ):
201
+ return self .__wrapped__ [key ]
202
+
203
+ def __setitem__ (self , key , value ):
204
+ self .__wrapped__ [key ] = value
205
+
206
+ def __getattr__ (self , name ):
207
+ if name == '__wrapped__' :
208
+ raise ValueError ('wrapper has not been initialised' )
209
+
210
+ return getattr (self .__wrapped__ , name )
211
+
212
+ def __iter__ (self ):
213
+ return iter (self .__wrapped__ )
214
+
215
+ class BBB (AAA ):
216
+ def __init__ (self , wrapped_dict = None ):
217
+ AAA .__init__ (self , wrapped_dict )
218
+
219
+ def __getattribute__ (self , name ):
220
+ if (hasattr (type (self ), name )
221
+ and isinstance (getattr (type (self ), name ), property )):
222
+ return object .__getattribute__ (self , name )
223
+ else :
224
+ return super ().__getattribute__ (name )
225
+
226
+ d = {"abc" : 1 }
227
+ assert dict (BBB (d )) == d
0 commit comments