[Tutor] object structure

spir ☣ denis.spir at gmail.com
Wed May 12 14:37:54 CEST 2010


Hello,


Python objects are supposed to be mainly a structure composed of a (pointer to a) type and a (pointer to a) value; and to be more or less implemented that way in the C version.

When an object is of a standard type like a number, the value field would then point to a C value, or rather in most cases to a custom piece of data built on top of C values. Anyway, this is transparent on the python language side. For an int, for instance, the actual value, in the common sense of the term, is unreachable: the python object has or is equivalent to a value, but does not provide a .value attribute: indeed, it would be a C thingie. In fact, since the object structure's value field points to this value, there is no place for a set of attributes (a dict) like custom objects have:
	i = 1 ; i.name = "one"	# -->
	AttributeError: 'int' object has no attribute 'name'
One can still address predefined fields of standard objects:
	i = 1 ; print i.__add__	# -->
	<method-wrapper '__add__' of int object at 0x8435d60>
But in fact the method __add__ is found on the class int, not on i; and as the text says it's not even really a method.

Instead this works, indeed:
	class C(object): pass
	c = C() ; c.name = 'c'
Precisely, custom objects have a dict to store arbitrary attributes. But they have no value in the common sense. Or rather their value, in the sense of what is pointed by the value field of the structure representing this object, would precisely be a dict representing a set of attributes.
If this holds true, then an object either has a transparent and inaccessible value in the common sense of the term (eg 1), or a dict of attributes (eg {name:'x',count:3}), which are accessible on the python side.

Comments, critics, corrections welcome.

Now, one can combine both, for instance by subtyping a standard type:

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):

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?


Denis
________________________________

vit esse estrany ☣

spir.wikidot.com


More information about the Tutor mailing list