Python 蟒蛇';打印';对账单不存在';是否不调用.write()方法?
我认为Python 蟒蛇';打印';对账单不存在';是否不调用.write()方法?,python,oop,file,inheritance,printing,Python,Oop,File,Inheritance,Printing,我认为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 +=
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))
如果我创建一个logfile
对象并调用write
方法,这似乎是可行的,但是当尝试将sys.stdout
对象更改为logfile
的一个实例时,似乎print
没有调用write
。可能是写线
使用此选项:
#!/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')
我的输出文件“somefile”包含:
this is a test
08/10/11-16:59:47 this is another test
您可以看到输出文件中的第一行是我试图打印的,第二行是在sys.stdout.write中使用的
我认为,
print
只是调用了write
方法-显然我缺少了一些基本的东西。显然这是Python2实现的一个限制,在Python2中,print是一个语句,而不是一个有副作用的表达式(就像Python3中那样)
我将代码重写为在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')
据我所知,在Python2中无法创建相同的行为
我还尝试使用来自uuu future uuu导入打印u函数的
,
,但没有任何区别。如果将文件放在实例变量中,它似乎可以工作
import time
class logfile(object):
def __init__(self, *args, **kwargs):
self.f = file(*args, **kwargs)
def write(self, logstr):
if logstr[-1] != '\n': logstr += '\n'
self.f.write(time.strftime('%D-%T ') + str(logstr))
不幸的是,它会记录额外的空行,这里有一个解决方案(打印“2”、“3”、“4”
写入3个条目):
这一个记录完整的行(注意:打印“4\n”,“5”
仍然是2个日志行):
有人知道如何在一行日志中处理完整的打印语句吗?解释了您的问题。基本上,如果sys.stdout
是file
的子类,那么print
将绕过sys.stdout.write
并直接写入sys.stdout.fd
你的问题的解决方法是使用组合而不是子类化
文件是否有帮助?print
有它自己的引用stdout
@Evpok我认为如果他试图重定向print而不是使用普通日志,他可能不想修改预先存在的print
语句。你应该使用用于记录到文件的日志记录模块。更具可配置性。您是故意避开Python的日志模块,还是这只是一个替代实现中的练习?
class logfile(object):
def __init__(self, *args, **kwargs):
self.f = file(*args, **kwargs)
self.c = False
def write(self, logstr):
self.c = not self.c
if logstr[-1] != '\n': logstr += '\n'
if self.c:
self.f.write(time.strftime('%D-%T ') + str(logstr))
class logfile(object):
def __init__(self, *args, **kwargs):
self.f = file(*args, **kwargs)
self.newline = True
def write(self, logstr):
if self.newline:
self.f.write(time.strftime('%D-%T '))
self.f.write(logstr)
self.newline = logstr[-1] == '\n'