2017-02-10 24 views
0

考慮在文件my_module.py代碼:意外的行爲,同時導入具有類定義的Python模塊

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。任何指向解釋這個的文檔的指針?

+0

無論如何,如果這就是你的意思,'x'不是在這裏作爲回調。你只需要一個參數'er',在'__init__'中你可以執行'self.x = er()' –

回答

3

因爲在Python中,默認參數值的計算方法是定義時間。例如參見questionthis notorious question

這是記錄here

的默認值在限定範圍函數定義 點評價,以便

i = 5 

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

i = 6 

f()將打印5.

重要警告:默認值只評估一次。當默認值是可變對象(如 列表,字典或大多數類的實例)時,此 會有所不同。例如, 以下功能積累傳遞給它的 後續調用的參數:

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