Mystery Theater New Style Classes

Bengt Richter bokr at
Thu Jul 24 21:51:42 CEST 2003

On Thu, 24 Jul 2003 14:26:20 -0400, "Terry Reedy" <tjreedy at> wrote:

>"Bob Gailer" <bgailer at> wrote in message
>news:mailman.1059062857.29503.python-list at
>> Predict the output:
>> class A(int):
>>      classval = 99
>>      def __init__(self, val = 0):
>>          if val:
>>              self = val
>>          else:
>>              self = A.classval
>I am not sure what the point is.  However,
>1.  Rebinding the local variable 'self' (or any other local variable)
>only affects further code within the function, which there is not any.
>So the above conditional is equivalent to 'pass'.
>2.  Because ints are immutable, the value of a new int is set within
>int.__new__, which is not overwritten.  Thus, the above __init__ is
>irrelevant.  In particular, the value of an A object has nothing to do
>with the defaulted parameter 'val=0'.
>> a=A(3)
>3. This is equivalent to a=int(3).  No surprises.
>> b=A()
>4. This is equivalent to b = int().  I thought this might raise an
>exception.  But after seeing the result (0). I remember Guido's
>decision (and a recent PyDev discussion thereof) that callable builtin
>types should, if possible, return a null value when getting a null
>input.  Hence
>>>> int(), long(), float(), tuple(), list(), dict()
>(0, 0L, 0.0, (), [], {})
>> print a,b
>5. Result is same if 'val=0' is changed to 'val=9' or anything else.
>> [from OP's self followup] The question this leads to is: how does
>one access the value of such a class within a class method?
>Since there is no class method presented, this make not much sense.
>Bob: were you aware of 4.) above when you posted this?
Maybe the OP will be helped by

 >>> class I(int):
 ...    def info(self): print type(self), self, type(int(self)), int(self)
 >>> i=I(123)
 <class '__main__.I'> 123 <type 'int'> 123

and the "value" he wants is int(self) ?

Bengt Richter

More information about the Python-list mailing list