Wie Unterklasse Sie den Dateityp in Python?
Frage
Ich versuche, die eingebaute in file
Klasse in Python zu Unterklasse einige zusätzliche Funktionen hinzufügen, um stdin
und stdout
. Hier ist der Code Ich habe so weit:
class TeeWithTimestamp(file):
"""
Class used to tee the output of a stream (such as stdout or stderr) into
another stream, and to add a timestamp to each message printed.
"""
def __init__(self, file1, file2):
"""Initializes the TeeWithTimestamp"""
self.file1 = file1
self.file2 = file2
self.at_start_of_line = True
def write(self, text):
"""Writes text to both files, prefixed with a timestamp"""
if len(text):
# Add timestamp if at the start of a line; also add [STDERR]
# for stderr
if self.at_start_of_line:
now = datetime.datetime.now()
prefix = now.strftime('[%H:%M:%S] ')
if self.file1 == sys.__stderr__:
prefix += '[STDERR] '
text = prefix + text
self.file1.write(text)
self.file2.write(text)
self.at_start_of_line = (text[-1] == '\n')
Der Zweck ist, einen Zeitstempel an den Anfang jeder Nachricht hinzuzufügen, und alles in eine Protokolldatei zu protokollieren. Allerdings ist das Problem, das ich in laufen, wenn ich dies tun:
# log_file has already been opened
sys.stdout = TeeWithTimestamp(sys.stdout, log_file)
Dann, wenn ich versuche print 'foo'
zu tun, erhalte ich eine ValueError: I/O operation on closed file
. Ich kann nicht sinnvoll file.__init__()
in meinem __init__()
nennen, da will ich nicht eine neue Datei öffnen, und ich kann self.closed = False
entweder nicht zugewiesen werden, da es sich um eine Nur-Lese-Attribut ist.
Wie kann ich das ändern, so dass ich print 'foo'
tun kann, und so, dass es alle Standard-file
Attribute und Methoden unterstützt?
Lösung
Der Aufruf file.__init__
ist durchaus möglich (zB auf ‚/ dev / null‘), aber keine wirkliche Verwendung, weil Ihr versucht, außer Kraft gesetzt write
nicht „nehmen“ für die Zwecke der print
Aussagen - letztere ruft intern die reale file.write
wenn es sieht, dass sys.stdout
eine tatsächliche Instanz von file
ist (und Sie durch erben haben es geschafft, so).
print
braucht nicht wirklich eine andere Methode außer write
, so dass Ihre Klasse erbt von object
statt file
machen funktionieren.
Wenn Sie andere Datei Methoden benötigen (das heißt, print
nicht alles Sie tun), sind Sie am besten beraten, sie selbst zu implementieren.
Andere Tipps
Sie können auch vermeiden super
mit:
class SuperFile(file):
def __init__(self, *args, **kwargs):
file.__init__(self, *args, **kwargs)
Sie werden in der Lage, mit ihm zu schreiben.