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'