newstyle classes and __getattribute__

Stefan Sonnenberg-Carstens stefan.sonnenberg at freenet.de
Fri Oct 28 23:52:55 CEST 2005


James Stroud schrieb:
> On Friday 28 October 2005 14:26, Stefan Sonnenberg-Carstens wrote:
> 
>>Hi there,
> 
> [..clip..]
> 
>>Now, I do this:
>>
>>class T(object):
>>	def __init__(self,name='',port=80):
>>		self.name=name
>>		self.port=port
>>	def __getattribute__(self,key):
>>		if key=='somekey':
>>			return None
> 
> [..snip..]
> 
>>But, then surprise:
>> >>> t = T(name="test123",port=443)
>> >>> dir(t)
>>
>>[]
>>
>>What the hell is going wrong here ?
> 
> 
> __getattribute__ is returning None in all cases and dir() is converting None 
> to [].
> 
> Anyway, you should have done this:
> 
> py> class T(object):
> ....     def __init__(self,name='',port=80):
> ....             self.name=name
> ....     def __getattribute__(self,key):
> ....             if key=='somekey':
> ....                     return None
> ....             else:
> ....               return object.__getattribute__(self, key)
> ....
> py> t = T(name="test123",port=443)
> py> dir(t)
> ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', 
> '__hash__', '__init__', '__module__', '__new__', '__reduce__', 
> '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'name']
> 
> James
> 
Sorry, but I am right that you explicitly call a "super" 
__getattribute__ on object and pass it a reference to self and the
desired key ?
Only asking for clarification ...

But why does that work under 2.4.1, and even under ActiveState's 2.4.1 ?
Was that changed between those 2 releases ?
Intuitive behaviour of __getattribute__ would be:
If a key is not handeld in that function, return what you already got.

Cheers,
Stefan




More information about the Python-list mailing list