I found this phrase in module fraction.py
of standard library:
class Fraction(numbers.Rational):
...
# We're immutable, so use __new__ not __init__
def __new__(cls, numerator=0, denominator=None, *, _normalize=True):
"""Constructs a Rational.
...
I am confused with it because Fraction
instance, strictly speaking, is not immutable:
import fractions
fraction = fractions.Fraction(3, 2)
fraction._numerator = 1 # it works
print(fraction) # 1/2
So, I'm asking for more clarification why __new__
is used instead of __init__
and what does this phrase mean here.