The curious behavior of integer objects

Calvin Spealman ironfroggy at
Mon Jan 15 23:50:56 CET 2007

As it turns out, this has little to do with integers and the
operations you are trying to do on them. I'll explain in more detail.

Integers are immutable, which you may already know. This presents a
problem with subclassing them and using the usual special method
__init__, because the int object has already been created by this
point and can not change. Another special method, __new__, is called
passing the class object itself (foo, in this case) for the first
argument (traditionally named cls, instead of self). The return of
this should be an integer which will be the value of your new foo

The following will do as you expected your own example to do.

class foo(int):
    def __new__(cls, value):
        return value & 0xF

assert foo(0x10) == 0  # Assertions are much better tests than prints :-)

On 1/15/07, Jim B. Wilson <wilson at> wrote:
> Am I nuts? Or only profoundly confused? I expected the this little script
> to print "0":
> class foo(int):
>   def __init__(self, value):
>     self = value & 0xF
> print foo(0x10)
> Instead, it prints "16" (at least on python 2.4.4 (Linux) and 2.5 (Wine).
> Jim Wilson
> --

Read my blog! I depend on your acceptance of my opinion! I am interesting!

More information about the Python-list mailing list