使用类定义导入python模块时出现意外行为

时间:2017-02-10 00:08:16

标签: python python-2.7 class python-import

考虑文件my_module.py中的代码:

class A(object):
  def __init__(self, x=er()):
    self.x = x

现在,当我导入这个模块时

import my_module

我收到错误,

name 'er is not defined

虽然我知道my_module没有定义er,但我从不创建class A的实例。因此,在简单地导入模块时,python试图执行__init__回调是令人费解的。虽然__init__调用没有完全执行,如下例所示:

class A(object):
  def __init__(self, x=5):
    self.x = x
    print ('I am here')

现在,当我导入模块时 - 没有打印任何内容,这是预期的行为。

我很困惑为什么在我没有实例化er的对象时,在第一个例子中调用了函数class A。任何解释这个的文档的指针?

1 个答案:

答案 0 :(得分:3)

因为在Python中,默认参数值是在定义时间计算的。例如,请参阅此questionthis notorious question

记录在案here

  

在函数定义点评估默认值   在定义范围内,以便

i = 5

def f(arg=i):
    print(arg)

i = 6
     

f()将打印5。

     

重要警告:默认值仅评估一次。这个   当默认值是可变对象(如a)时,会有所不同   列表,字典或大多数类的实例。例如,   以下函数累积传递给它的参数   后续电话:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))
     

这将打印

[1]
[1, 2]
[1, 2, 3]
     

如果您不希望在后续通话之间共享默认值,   你可以这样编写这样的函数:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L