我在标准库的模块^{
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中真正实现不变性。更疯狂的执法尝试总是会遇到更疯狂的绕道。例如,
numerator
和denominator
是没有setter的属性,但是您已经找到了绕过它的方法。你知道吗如果你真的想处理一个分数对象,你可以,你可以做比设置
_numerator
更糟糕的事情,但是你在问问题。你知道吗相关问题 更多 >
编程相关推荐