python2.7 - Python 2.7 stdout重定向的疑問
問題描述
先上代碼
import sysclass TestWriter(object): def __init__(self, stream=sys.stdout):super(TestWriter, self).__init__()self.stream = stream def write(self, line):self.stream.write(line)tmp = sys.stdoutf = open(’d:stdout.txt’, ’w’)try: sys.stdout = f adpt = TestWriter() //如果這里我把f當(dāng)參數(shù)傳入,則執(zhí)行結(jié)果如預(yù)期。 adpt.write(’asdfwe’) // 預(yù)期字符串寫入文本,單事實(shí)上字符串輸出到了屏幕。 print ’this is import from print’ //如預(yù)期的輸入到了文本except Exception, e: sys.stdout = tmp print efinally: sys.stdout = tmp f.close()print ’finish’
問題:就如我注釋里寫的,調(diào)用TestWriter.write()的時(shí)候沒有實(shí)現(xiàn)sys.stdout的重定向輸出,但之后的print證明了標(biāo)準(zhǔn)輸出已經(jīng)重定向到了文件f對(duì)象。斷點(diǎn)跟蹤的時(shí)候,self.stream也顯示為f對(duì)象求解惑!!!
問題解答
回答1:def __init__(self, stream=sys.stdout)
Python在創(chuàng)建每個(gè)函數(shù)時(shí),每個(gè)參數(shù)都會(huì)被綁定,默認(rèn)值不會(huì)隨著值的改變而重新加載
# coding: utf-8D = 2 class Test: def __init__(self, a=D):print aif __name__ == ’__main__’: D = 3 t = Test() print Dinner function: 2outer function: 3
但如果綁定參數(shù)默認(rèn)參數(shù)綁定的是地址,那就不一樣,地址不變,內(nèi)容可以變.
# coding: utf-8D = [3] class Test: def __init__(self, a=D):print 'inner function: ', aif __name__ == ’__main__’: D[0] = 2 t = Test() print 'outer function:', D inner function: [2]outer function: [2]回答2:
In contrast, in Python, execution begins at the top of one file and proceeds in a well-defined order through each statement in the file, ...
http://stackoverflow.com/ques...
python會(huì)順序解釋每條語句,所以TestWriter的構(gòu)造器參數(shù)stdout沒有被重定向。
以上都是我猜的
=====================================================================
import sysclass A: def __init__(self, stream=sys.stdout):print(stream)f = open(’test.txt’, ’w’)a = A()sys.stdout = fprint(sys.stdout)
運(yùn)行結(jié)果
相關(guān)文章:
1. php多任務(wù)倒計(jì)時(shí)求助2. 數(shù)組排序,并把排序后的值存入到新數(shù)組中3. 默認(rèn)輸出類型為json,如何輸出html4. python的正則怎么同時(shí)匹配兩個(gè)不同結(jié)果?5. javascript - jquery怎么讓a標(biāo)簽跳轉(zhuǎn)后保持tab的樣式6. PHP訂單派單系統(tǒng)7. javascript - charles map remote映射問題8. javascript - vue組件的重復(fù)調(diào)用9. mysql - sql 左連接結(jié)果union右連接結(jié)果,導(dǎo)致重復(fù)性計(jì)算怎么解決?10. javascript - console.log(typeof(named));的位置不同,第二個(gè)為什么會(huì)顯示undefined ?
