我定义了一个具有许多子类的类Device
,例如Microcontroller
。
设备有两种模式,特别是"模拟"模式。
我正在尝试对Device
类进行编码,如果Microcontroller
处于模拟模式,那么当执行打印时,它应该在字符串前加[simulated]
:
print "Hey !!"
> [simulated] Hey!!
我不知道如何开始,以及是否可能超载print
。
答案 0 :(得分:0)
您可以实现一些记录器类,并将其用于记录。您可以根据需要进行圆顶物体注入以替换记录器的类型。例如:
class Logger:
def __init__(self, prefix):
self.prefix = prefix
def log(self, msg):
print('[{}] {}'.format(self.prefix, msg))
class Base:
def set_logger(self, logger):
self.logger = logger
class Test(Base):
def do_something(self):
self.logger.log('Hey !!')
test = Test()
test.set_logger(Logger('simulated'))
test.do_something()
test.set_logger(Logger('very real'))
test.do_something()
例如:
[simulated] Hey !!
[very real] Hey !!
答案 1 :(得分:0)
我将通过建议您从未在实际代码中使用此方法来开始此答案。但是,为了完整性(并且因为它回答了原始问题),我想我会在这里添加它。
因此,您可以通过重定向print
来动态重定向并捕获sys.stdout
语句。
您可以从定义类似文件的对象开始,该对象捕获stdout
并重定向到... stdout
。
import sys
class OutputFormatter(object):
def __init__(self,prefix="",suffix=""):
self.prefix = prefix
self.suffix = suffix
def write(self,msg):
# As you want to change the behaviour of the print statement,
# you need to ignore solitary newlines that are sent to stdout
if msg != '\n':
# reformat the message passed by print
msg = " ".join([self.prefix,msg,self.suffix])
# redirect back to stdout
sys.__stdout__.write(msg)
有了这个,您可以使用它来替换{{1}}以产生您描述的“覆盖”类型的打印行为。
sys.stdout
这将在终端上打印以下内容:
class Device(object):
def set_simulated(self):
# in simulated mode, use the stdout redirect
sys.stdout = OutputFormatter(prefix="[simulated]",suffix="")
def set_real(self):
# in real mode make sure to return to proper stdout
sys.stdout = sys.__stdout__
class Microcontroller(Device):
def __init__(self):
super(Microcontroller,self).__init__()
self.set_simulated()
print "This is simulated"
self.set_real()
print "This is real"
Microcontroller()
请注意,这是对[simulated] This is simulated
This is real
行为的全局更改,如果stdout
子类已设置为模拟模式,则会影响所有打印语句。
对于需要上下文相关消息的类似系统,更好的方法是使用logging module或采用BSH建议的方法。