@@ -180,3 +180,48 @@ def test_descr_call_with_none():
180180 assert None .__class__ is type (None )
181181 assert descr .__get__ (None , type (None )) is descr
182182 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