在Python中扩展一个不可变的类时,为什么需要使用\uyu new_uuu()?

2024-05-23 16:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读《掌握面向对象的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中如何实现不可变类的初始化?在


Tags: 对象方法selfmostnewinitvalueunit
2条回答

如果执行MyClass(1),那么1确实作为参数传递给__init__。但是__new____init__之前被调用,因此1首先被作为参数传递给__new__。您看到的错误是因为您没有重写__new__,所以正在调用继承的{},它不接受您的额外参数。它甚至没有机会尝试调用__init__,因为它在尝试调用__new__时失败。在

这在the documentation中有解释。正如这里明确指出的那样,在注入一个类时传递的参数(例如,MyClass(1)中的1)将按顺序传递给两个__new____init__。在

__init__方法运行时,该对象已经存在。因为对象是不可变的,所以它的值不能在__init__中更改。在

相关问题 更多 >