“我们是不可变的,所以请使用\uuu new\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu not \uuuuuuuuuuu init\uuuuuuuuuuuuuuuuuuuuu

2024-04-26 22:13:05 发布

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

我在标准库的模块^{}中发现了这个短语:

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__,以及这个短语在这里的含义。你知道吗


Tags: 模块renew标准soinitclassimmutable
1条回答
网友
1楼 · 发布于 2024-04-26 22:13:05

它在逻辑上是不变的,不是强制的。基本上不可能在Python中真正实现不变性。更疯狂的执法尝试总是会遇到更疯狂的绕道。例如,numeratordenominator是没有setter的属性,但是您已经找到了绕过它的方法。你知道吗

如果你真的想处理一个分数对象,你可以,你可以做比设置_numerator更糟糕的事情,但是你在问问题。你知道吗

相关问题 更多 >