脚本和解释器之间的奇怪区别:不能在__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命中class语句时,将创建一个class对象,然后继续在class body中创建function对象。

巴尔玛

功能参数的默认值是在定义功能时计算的。但是,直到类定义完成您才能引用类

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

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

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

x = x + 1

如果将其单独放在脚本中,则会出现错误。但是,如果您在IDLE中使用它,并且您之前已经做过

x = 3

在同一个IDLE会话中,它将起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能将类属性作为参数直接分配给类括号,而不是使用def __init__方法?

是否可以在Kotlin中将类属性作为函数参数传递?

引用Kotlin类属性设置器作为函数

在构造函数内部或外部设置类属性的默认值之间有什么区别?

访问类属性作为装饰器参数

为什么不能在C ++中将函数求值作为构造函数参数传递?

在__init__中更改类属性

JavaScript 将类属性作为参数传递给函数

如何在 vs 代码中将 python 作为默认解释器

为什么不能在C ++中将迭代器作为参考?

为什么我们不能在 JavaFX 中将属性作为参数传递给 Property#unbind()?

作为函数的Python属性的默认参数

为什么函数默认参数不能在C ++中转发?

类属性不能在 myFunction 中引用,有没有更好的做法

类型参数不能在Scala的函数体中引用吗?

不能在 Python 中使用列表作为函数参数

不能在函数中使用类作为参数(JScript)

属性或索引器不能作为输出或引用参数 Xamarin.Forms (C#) 传递

代码下划线和解释器之间有什么区别?

__init__作为构造函数?

在Julia中将类型参数作为函数参数引用

Swift - 引用默认比较函数作为函数参数

类属性和具有默认值的实例变量之间的区别

类属性和变量之间的区别?

构造函数:默认和委派参数之间的区别

是否可以在setter中将属性作为ref参数传递?c#(避免“属性或索引器不能作为out或ref参数传递”。)

编译和解释之间有什么区别?

Python使用子类的类属性作为默认参数而不覆盖方法

能否在python类的__init__中使用静态方法作为默认参数?