我正在读《掌握面向对象的Python》一书。在书中讨论__new__
方法和不可变对象的部分,它说类似__new__()
方法是用来扩展不可变类的,其中__init__()
方法不容易被重写。下面给出了一个例子
class Float_Fail(float):
def __init__(self, value, unit):
super().__init__(value)
self.unit = unit
f = Float_Fail(6.5, "knots")
TypeError Traceback (most recent call last)
<ipython-input-2-9511e6ca03be> in <module>()
----> 1 f = Float_Fail(6.5, "knots")
TypeError: float() takes at most 1 argument (2 given)
我只是好奇为什么float会出现这个错误。我的意思是,我们可以像这样初始化一个浮点:
^{pr2}$这不意味着float
类的__init__()
方法将数字作为第二个参数。如果不是,那么在Python中如何实现不可变类的初始化?在
如果执行},它不接受您的额外参数。它甚至没有机会尝试调用
MyClass(1)
,那么1
确实作为参数传递给__init__
。但是__new__
在__init__
之前被调用,因此1
首先被作为参数传递给__new__
。您看到的错误是因为您没有重写__new__
,所以正在调用继承的{__init__
,因为它在尝试调用__new__
时失败。在这在the documentation中有解释。正如这里明确指出的那样,在注入一个类时传递的参数(例如,
MyClass(1)
中的1
)将按顺序传递给两个__new__
和__init__
。在当
__init__
方法运行时,该对象已经存在。因为对象是不可变的,所以它的值不能在__init__
中更改。在相关问题 更多 >
编程相关推荐