gpt4 book ai didi

python - "We' 是不可变的,所以使用 __new__ 而不是 __init__”

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:49 25 4
gpt4 key购买 nike

我在模块 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 中真正强制执行不变性基本上是不可能的。更疯狂的执法尝试总是会遇到更疯狂的绕过。例如,numeratordenominator 是没有 setter 的属性,但您已经找到了绕过它的方法。

如果你真的想搞砸一个 Fraction 对象,你可以,而且你可以做的比设置 _numerator 更糟糕,但你是在自找麻烦。

关于python - "We' 是不可变的,所以使用 __new__ 而不是 __init__”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57741347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com