在python中调用int的__init__看似微不足道的问题

时间:2014-02-22 21:16:08

标签: python class inheritance

请注意以下代码:

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

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

相当简单的东西,Angle基本上只是int,它永远不会高于360或低于0.这个__init__只是确保输入角度与之前列出的条件匹配。但出于某种原因,上面的代码给了我以下输出:

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

为什么会发生这种情况?代码对我来说似乎微不足道,但也许我只是遗漏了一些非常明显的东西。

2 个答案:

答案 0 :(得分:3)

对于像int

这样的不可变类,你应该覆盖__new__
class Angle(int):
  def __new__(cls, val):
    val %= 360
    inst = super(Angle, cls).__new__(cls, val)
    return inst

请参阅python datamodel了解详情

答案 1 :(得分:0)

参考python对象接口的new方法。

  

__new__()主要用于允许不可变类型的子类(如int,str或tuple)自定义实例创建。也是   通常在自定义元类中重写以自定义类   创建