我在模块 fraction.py
中找到了这个短语标准库:
class Fraction(numbers.Rational):
...
# We're immutable, so use __new__ not __init__
def __new__(cls, numerator=0, denominator=None, *, _normalize=True):
"""Constructs a Rational.
...
我对此感到困惑,因为严格来说,Fraction
实例不是不可变的:
import fractions
fraction = fractions.Fraction(3, 2)
fraction._numerator = 1 # it works
print(fraction) # 1/2
因此,我要求更多说明为什么使用 __new__
而不是 __init__
以及这个短语在这里的含义。
最佳答案
它在逻辑上是不可变的,而不是强制的。在 Python 中真正实现不变性基本上是不可能的。更疯狂的执法尝试总是会遇到更疯狂的绕行。例如,分子
和 分母
是没有 setter 的属性,其中存在一些“强制”,但您已经找到了绕过它的方法。
如果你真的想搞砸 Fraction 对象,你可以,而且你可以做比设置 _numerator
更糟糕的事情,但你是在自找问题。
关于python - "We' 是不可变的,所以使用 __new__ 而不是 __init__",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57741347/