[Tutor] object structure

Eike Welk eike.welk at gmx.net
Wed May 12 22:49:50 CEST 2010


Hello Denis!


On Wednesday May 12 2010 14:37:54 spir ☣ wrote:
> class Integer(int): pass
> i = Integer(1)
> i.name = "one"
> print i,i.name	# --> "1 one"
> 
> An instance of Integer has both a value 1 and a dict. Actually, one can do
>  more sophisticated things (below __new__ is needed because of some
>  limitation in float):

I think it's the other way round: It is quite odd that "Integer" works without 
"__new__".

> class Constant(float):
>     def __new__(cls, name, value):
>         obj = float.__new__(cls, value)
>         obj.name = name
>         return obj
>     def __str__(self):
>         return "%s:%s" %(self.name, float.__str__(self))
> PI = Constant("pi", 3.14)
> print PI      # --> "pi:3.14"
> 
> In either case, the actual numerical value is transparently stored and
>  inaccessible: reason why I need to use float.__str__ to print it out. But
>  there also is a dict available to store attributes.
> 
> So, a question arises: does the structure representing a Constant object
>  like PI have one more field? Namely for type, value *and* dict?

I think you are right. The instances of class "Constant" have a "__dict__" 
while the "float" instance don't have it. And obviously the "float" instances 
contain some hidden data to encode the value.

However this mechanism (or a very similar one) is available to Python 
programmers too: classes with a "__slots__" declaration.
http://docs.python.org/reference/datamodel.html#slots

Instances of these classes have no "__dict__" attribute. The attributes 
declared with slots are also computed attributes. This means instead of 
accessing the attribute directly, the Python interpreter calls a function, 
which returns the attribute. (The function, really the descriptor, is stored 
in the class.) 

As you can inherit from classes with a "__slots__" declaration, I think all 
built in classes could be implemented elegantly with this underlying 
mechanism: 
- It is a mechanism for conserving memory (no "__dict__"), important for 
numbers.
- It is also a mechanism for storing hidden data somewhere in the object. The 
implementation available to the Python programmers is not very exciting, but 
it could be used for everything. 



Eike.   


More information about the Tutor mailing list