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当参数传入,则执行结果如预期。 adpt.write(’asdfwe’) // 预期字符串写入文本,单事实上字符串输出到了屏幕。 print ’this is import from print’ //如预期的输入到了文本except Exception, e: sys.stdout = tmp print efinally: sys.stdout = tmp f.close()print ’finish’
问题:就如我注释里写的,调用TestWriter.write()的时候没有实现sys.stdout的重定向输出,但之后的print证明了标准输出已经重定向到了文件f对象。断点跟踪的时候,self.stream也显示为f对象求解惑!!!
问题解答
回答1:def __init__(self, stream=sys.stdout)
Python在创建每个函数时,每个参数都会被绑定,默认值不会随着值的改变而重新加载
# 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
但如果绑定参数默认参数绑定的是地址,那就不一样,地址不变,内容可以变.
# 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会顺序解释每条语句,所以TestWriter的构造器参数stdout没有被重定向。
以上都是我猜的
=====================================================================
import sysclass A: def __init__(self, stream=sys.stdout):print(stream)f = open(’test.txt’, ’w’)a = A()sys.stdout = fprint(sys.stdout)
运行结果
相关文章:
1. java - 反射数组:为什么每次获取Modifiers都是public,abstract,以及final2. javascript - jquery对象被定义成jquery变量后,怎么使用:gt这个(可能表达有问题)3. 怎样使留言的数据与登录的用户名,密码保持一致(在数据库上是一行的)。4. angular.js - vue or angular.2 or react5. html - css气泡,实现“倒三角(不知道算不算三角了)”可透明的。6. TP5.1教程第十章三小节的用户注册章节,不能显示bootstrap的菜单下拉,也不能script验7. win10 Apache24+PHP8.0,Apache不能正常加载php.ini。8. PHP中的$this代表当前的类还是方法?9. 前端 - 访问Apache文档目录下的HTML文件变成了下载该页面?10. css - sudo gem install jekyII 出现错误
