7

log.txtPython を使用して、端末のファイルと STDOUTの両方に出力を送信したいと考えています。ここに私が持っているものがあります:

import sys
class Logger(object):
    def __init__(self, filename="Default.log"):
        self.terminal = sys.stdout
        self.log = open(filename, "a")

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

sys.stdout = Logger("log.txt")
print "Hello world !"            #This line is saved in log.txt and STDOUT

このプログラムは、出力をファイルと stdout に送信します。私の質問は次のとおりです。ファイルへの書き込み関数はどのように呼び出されましたか?

4

2 に答える 2

3

sys.stdoutのドキュメントから:

stdout と stderr は組み込みのファイル オブジェクトである必要はありません。文字列引数を取る write() メソッドがある限り、任意のオブジェクトを使用できます。

于 2013-02-22T09:09:33.543 に答える
2

より具体的には、print関数 (Python 2.X ではまだキーワードですが、ここでは関係ありません) は次のようなことを行います。

import sys
def print(message):
    sys.stdout.write(message)

そのため、それを呼び出すと、sys.stdout にメッセージが出力されます。ただし、sys.stdout を .write メソッドを含むオブジェクトで上書きすると、そのメソッドが呼び出されます。それがダックタイピングの魔法です。

于 2013-02-22T09:21:45.413 に答える