请注意以下代码:
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
为什么会发生这种情况?代码对我来说似乎微不足道,但也许我只是遗漏了一些非常明显的东西。
答案 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)自定义实例创建。也是 通常在自定义元类中重写以自定义类 创建