2011-06-20 39 views
2

只是好奇,爲什麼下面的代碼Python異常訂貨

import sys 
class F(Exception): 
    sys.stderr.write('Inside exception\n') 
    sys.stderr.flush() 
    pass 

sys.stderr.write('Before Exception\n') 
sys.stderr.flush() 

try: 
    raise F 
except F: 
    pass 

輸出:

Inside exception 
Before Exception 

,而不是:

Before exception 
Inside Exception 

回答

1

由於斯文正確說,類實體在執行類定義時立即執行。

在你的代碼中,你的類F的定義高於這個命令sys.stderr.write('Before Exception\n'),因此這個sys.stderr.write('Inside exception\n')首先被執行,因此它的輸出首先被看到。

作爲測試,運行這個程序 -

import sys 

sys.stderr.write('Before Exception\n') 
sys.stderr.flush() 

class F(Exception): 
    sys.stderr.write('Inside exception\n') 
    sys.stderr.flush() 
    pass 

try: 
    raise F 
except F: 
    pass 

輸出現在你將得到的是 -

Before exception 
Inside Exception 

這僅僅是因爲類定義被執行之前的聲明sys.stderr.write('Before Exception\n')得到執行。

事實上,Inside Exception的打印與您初始化F實例無關(使用raise)。無論您是否初始化F實例,它都會打印。

試試這個 -

import sys 

class F(Exception): 
    sys.stderr.write('Inside exception\n') 
    sys.stderr.flush() 
    pass 

不過你會得到這樣的輸出 -

Inside Exception 

雖然你還沒有使用類的一個實例F.

8

你在課堂上進行打印,而不是它的初始化塊。嘗試運行此

import sys 
class F(Exception): 
    sys.stderr.write('Inside exception\n') 
    sys.stderr.flush() 
    pass 

單獨。即當您致電raise F時,它不運行。試試這個

import sys 
class F(Exception): 
    def __init__(): 
     sys.stderr.write('Inside exception\n') 
     sys.stderr.flush() 

raise new F() 
0

你必須在類級別聲明:

class F(Exception): 
    sys.stderr.write('Inside exception\n') 

考慮這一點,直到你創建一個對象實例,它不會被執行:

class F(Exception): 
    def __init__(self): 
     sys.stderr.write('Inside exception\n')