Python 脚本和解释器之间的奇怪区别:can';t引用class属性作为_init__函数中的默认参数

Python 脚本和解释器之间的奇怪区别:can';t引用class属性作为_init__函数中的默认参数,python,class,Python,Class,我在python解释器(IDLE)中运行了上面的代码,它运行得非常好。然后,我将代码粘贴到atom中,并以交互模式运行代码,它返回以下错误: class f: x = 5 def __init__(self, bar = f.x): self.bar = bar def fn(r, test = print(f.x)): return r 回溯(最近一次呼叫最后一次): 文件“testing.py”,第28行,在 f类: 文件“test

我在python解释器(IDLE)中运行了上面的代码,它运行得非常好。然后,我将代码粘贴到atom中,并以交互模式运行代码,它返回以下错误:

class f:
    x = 5
    def __init__(self, bar = f.x):
        self.bar = bar

    def fn(r, test = print(f.x)):
        return r
回溯(最近一次呼叫最后一次):
文件“testing.py”,第28行,在
f类:
文件“testing.py”,第30行,在f中
def ___;初始值(自,条形=f.x):
NameError:未定义名称“f”

为什么不同?为什么“f”没有定义?我认为,当python点击class语句时,is会创建一个class对象,然后继续在类主体内创建函数对象

函数参数的默认值是在定义函数时计算的。但在完成类定义之前,不能引用类

当你在空闲状态下做这件事的时候,我怀疑你之前对
f
有一个定义,并且你在重新定义它。在新定义完成之前,旧定义仍然有效,因此
f.x
引用了
f.x
的旧值

当您将其放入脚本中时,它是重新开始的,因此之前没有对
f
的定义,并且在函数定义期间尝试计算
f.x
时出错

作为一个简单的例子,考虑一个类似

的语句。
Traceback (most recent call last):
  File "testing.py", line 28, in <module>
    class f:
  File "testing.py", line 30, in f
    def __init__(self, bar = f.x):
NameError: name 'f' is not defined
如果将其单独放入脚本中,则会出现错误。但是如果你在空闲时使用它,而你之前已经这样做了

x = x + 1

在同一空闲会话中,它会工作。

bar=f.x
是问题所在。您正试图将参数
bar
的默认值定义为
f
的属性
x
。由于
f
未定义(或当前正在定义),因此引用它是一个错误,几乎可以肯定它在空闲时实际上不起作用。您可能运行了一些微妙的不同,并认为您运行的是与发布的相同的东西,可能是因为IDLE处理多行语句的方式很奇怪。此外,类对象是在函数之后创建的,直到执行class语句的最后一步,它才被分配给变量。是的,你完全正确-我重新启动IDLE并粘贴了相同的代码,但它不起作用。当我第一次尝试这段代码时,我已经定义了f。谢谢你的帮助!
x = 3