user3002473
user3002473

Reputation: 5074

Seemingly trivial issue calling int's __init__ in python

Observe the following Python 2.x code:

class Angle(int):
    """Basic Angle object: Angle(number)"""

    def __init__(self, angle):
        angle %= 360
        super(Angle, self).__init__(angle)

Fairly simple stuff, Angle is basically just an int that never goes above 360 or below 0. This __init__ just makes sure that the input angle matches the conditions listed prior. But for some reason the above code gives me the following output:

>>> a = Angle(322)
>>> a
322
>>> b = Angle(488)
>>> b
488

Why on earth would this be happening? The code seemed so trivial to me, but maybe I'm just missing something really obvious.

Upvotes: 5

Views: 79

Answers (2)

Kirill Zaitsev
Kirill Zaitsev

Reputation: 4849

You should be overriding __new__ for immutable classes like int

class Angle(int):
  def __new__(cls, val):
    val %= 360
    inst = super(Angle, cls).__new__(cls, val)
    return inst

see python datamodel for more info

Upvotes: 3

praveen
praveen

Reputation: 3253

Consult new method of python's object interface.

__new__() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize instance creation. It is also commonly overridden in custom metaclasses in order to customize class creation.

Upvotes: 0

Related Questions