[Tutor] Poorly understood error involving class inheritance

David Perlman dperlman at wisc.edu
Thu Sep 10 22:51:02 CEST 2009


Well, here's what I am really doing:

class oneStim(str):
     def __init__(self, time, mods=[], dur=None, format='%1.2f'):
         self.time=time
         self.mods=mods
         self.dur=dur
         self.format=format

     def __cmp__(self,other):
         return cmp(self.time,other.time)

     def __repr__(self):
         timestr=self.format % self.time
         if self.mods == []:
             modstr=''
         else:
             modstr = '*' + ','.join(self.format % i for i in self.mods)
         if self.dur == None:
             durstr = ''
         else:
             durstr = ':' + (self.format % self.dur)
         return timestr + modstr + durstr

     def __len__(self):
         return len(self.__repr__())


The purpose of this is to make an object that holds a collection of  
numbers and represents them as a specifically formatted string.  I  
want to be able to do something like:

 >>> z=oneStim(22.5678)
 >>> z.dur=10
 >>> z
22.57:10.00
 >>> len(z)
11
 >>> z.rjust(20)
'             22.5678'

Note that that doesn't work either.  It works fine like this, though:
 >>> z
22.57:10.00
 >>> str(z).rjust(20)
'         22.57:10.00'

I can work with that just fine, but I am curious to understand what's  
going on under the hood that makes it fail when subclassed from str...


On Sep 10, 2009, at 3:42 PM, Serdar Tumgoren wrote:

>>>>> class dummy2(str):
>> ...     def __init__(self,dur=0):
>> ...             self.dur=dur
>> ...
>>>>> z=dummy2(3)
>>>>> z.dur
>> 3
>>
>> So far so good.  But:
>>
>>>>> z=dummy2(dur=3)
>> Traceback (most recent call last):
>>  File "<stdin>", line 1, in <module>
>> TypeError: 'dur' is an invalid keyword argument for this function
>>>>>
>
> I think you're problem may stem from the fact that you subclassed the
> string type and then tried to pass in an integer.
>
>>>> class Dummy2(int):
> ...     def __init__(self, dur=0):
> ...         self.dur = dur
> ...
>>>> z = Dummy2(3)
>>>> z.dur
> 3
>
> When you sub "int" for "str", it seems to work. Is there a reason
> you're not just subclassing "object"? I believe doing so would give
> you the best of both worlds.

--
-dave----------------------------------------------------------------
"Pseudo-colored pictures of a person's brain lighting up are
undoubtedly more persuasive than a pattern of squiggles produced by a
polygraph.  That could be a big problem if the goal is to get to the
truth."  -Dr. Steven Hyman, Harvard





More information about the Tutor mailing list