我定義了一個類Device
,其中有很多子類,例如Microcontroller
。類的繼承和定製
設備有兩種模式,尤其是「模擬」模式。
我試圖代碼Device
類等具有如果Microcontroller
是那麼當進行打印,應該由[simulated]
前綴字符串模擬模式:
print "Hey !!"
> [simulated] Hey!!
我不知道如何下手,如果有可能超載print
。
我定義了一個類Device
,其中有很多子類,例如Microcontroller
。類的繼承和定製
設備有兩種模式,尤其是「模擬」模式。
我試圖代碼Device
類等具有如果Microcontroller
是那麼當進行打印,應該由[simulated]
前綴字符串模擬模式:
print "Hey !!"
> [simulated] Hey!!
我不知道如何下手,如果有可能超載print
。
您可以實現一些記錄器類,並將其用於記錄。你可以做圓頂對象注入來代替記錄器的類型。例如:
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 !!
謝謝!你回答了我的問題 – Katsu
我會建議你千萬不要用在真正的代碼,這種方法前言這個答案。然而,爲了完整性(並且它回答了原始問題),我想我會在這裏添加它。
因此,您可以通過重定向sys.stdout
即時重定向並捕獲print
報表。
您可以從定義類似文件的對象開始,該對象捕獲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)
有了這個,你可以用它來代替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
行爲的全球變化將影響所有的打印語句如果Device
子類已設置爲模擬模式。
對於需要上下文相關消息的系統,更好的方法是使用logging module或採用BSH建議的方法。
您將需要創建自己的打印函數來檢查微控制器是否在模擬器中,如果是,則添加必要的前綴。 – Ryan
好吧,但有可能超載打印? (像運營商) – Katsu
@Katsu你不能超載打印作爲一個聲明,你必須自己做一個功能。 –