tMC*_*tMC 6 python printing oop inheritance file
我认为该print语句只是在sys.stdout(默认情况下)对象上调用了.write()方法.
但是写了一个像这样的子类:
import time
class logfile(file):
def __init__(self, *args, **kwargs):
file.__init__(self, *args, **kwargs)
def write(self, logstr):
if logstr[-1] != '\n': logstr += '\n'
super(logfile, self).write(time.strftime('%D-%T ') + str(logstr))
Run Code Online (Sandbox Code Playgroud)
它似乎工作,如果我创建一个logfile对象并调用该write方法,但当试图将sys.stdout对象更改为一个实例时,logfile它似乎print没有调用write.也许writelines?
使用这个:
#!/usr/bin/python
from myfile import logfile
import sys
sys.stdout = logfile('somefile', 'w')
print 'this is a test'
sys.stdout.write('this is another test')
Run Code Online (Sandbox Code Playgroud)
我的输出文件'somefile'包含:
this is a test
08/10/11-16:59:47 this is another test
Run Code Online (Sandbox Code Playgroud)
您可以看到输出文件中的第一行是我尝试过的,print第二行是使用的内容sys.stdout.write
我以为print刚刚调用了write方法 - 显然我遗漏了一些基本的东西.
显然,这是 Python 2 实现的限制,其中 print 是一个语句,而不是一个有副作用的表达式(就像在 Python 3 中一样)。
我将代码重写为可在 Python 3 中运行的代码:
from io import FileIO
import time
class logfile(FileIO):
def __init__(self, *args, **kwargs):
FileIO.__init__(self, *args, **kwargs)
def write(self, logstr):
if logstr[-1] == '\n': logstr = logstr[:-1]
super(logfile, self).write(bytes(time.strftime('%D-%T ') + str(logstr), 'UTF-8'))
import sys
sys.stdout = logfile('somefile', 'w')
print("This is a test")
sys.stdout.write('this is another test')
Run Code Online (Sandbox Code Playgroud)
据我所知,在 Python 2 中无法创建相同的行为。
我也尝试过使用,from __future__ import print_function但这没有什么区别。