Extending built-in objects/classes

John Machin sjmachin at lexicon.net
Mon Jul 3 08:55:21 EDT 2006


On 3/07/2006 10:01 PM, Jon Clements wrote:
> John Machin wrote:
> (snip)
>> You have already been told: you don't need "self.<what>", you just write
>> "self" ... self *is* a reference to the instance of the mystr class that
>> is being operated on by the substr method.
>>
> (snip)
> 
> I get that; let me clarify why I asked again.
> 
> As far as I'm aware, the actual representation of a string needn't be
> the same as its 'physical' value. ie, a string could always appear in
> uppercase ('ABCD'), while stored as 'aBcd'. If I need to guarantee that
> substr always returned from the physical representation and not the
> external appearance, how would I do this? Or, would self, always return
> internal representation, (if so, how would I get external appearance?).
> 
> Or I could be talking complete _beep_ - in which case I apologise.
> 
> Jon.
> 
The external appearance of an object is produced by repr and str 
methods. These transform the internal value into a human-readable (and 
Python-compilable, in the case of repr) format. When you are 
subclassing, these methods would normally be inherited.

Let's transpose your question into the realm of floats. A float is 
usually a 64-bit gizmoid with about 53 bits of mantissa, a sign bit, and 
the rest is for the exponent. The external representations are character 
strings like '3.3333333333333333e-021'. You want to subclass float so 
that you can add handy methods like squared(). You would like it to be 
as simple as:

def squared(self):
     return self * self

There are two possibilities:
(a) It just works; e.g. print myfloat(1.1).squared() produces 1.21
(b) It doesn't work, you get some mysterious exception like

     TypeError: can't multiply sequence by non-int

which you decode as meaning that it doesn't like you trying to multiply 
two character strings together, and you have to code the return 
expression as self.__internal__ * self.__internal__ or something like that.

1. Which of these possibilities do you think is more 
useful/elegant/plausible?
2. [Stop me if you've heard this one before] When you try it out, what 
happens?
3. Have you ever seen any indication in the manuals, tutorials, books, 
code published online, etc etc as to which possibility has been implemented?

HTH,
John



More information about the Python-list mailing list