首页 > 解决方案 > 脚本和解释器之间的奇怪区别:不能在 __init__ 函数中引用类属性作为默认参数

问题描述

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

    def fn(r, test = print(f.x)):
        return r

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

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

为什么有区别?为什么没有定义“f”?我认为当python命中类语句时,是创建一个类对象,然后在类体内继续创建函数对象。

标签: pythonclass

解决方案


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

当您在 IDLE 中执行此操作时,我怀疑您之前有一个定义,f并且您正在重新定义它。在新定义完成之前,旧定义仍然有效,因此f.x引用了 的旧值f.x

当你把它放在一个脚本中时,它是从新开始的,所以没有以前的定义,并且在函数定义期间f尝试评估时出错。f.x

作为一个更简单的例子,考虑如下语句

x = x + 1

如果你把它单独放在一个脚本中,你会得到一个错误。但是如果你在 IDLE 中使用它,并且你之前已经做过

x = 3

在同一个空闲会话中,它会起作用。


推荐阅读