pythons'print'语句不调用.write()方法?

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方法 - 显然我遗漏了一些基本的东西.

Hob*_*lin 4

显然,这是 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但这没有什么区别。