2014-05-16 85 views
0

我定義了一個類Device,其中有很多子類,例如Microcontroller類的繼承和定製

設備有兩種模式,尤其是「模擬」模式。

我試圖代碼Device類等具有如果Microcontroller是那麼當進行打印,應該由[simulated]前綴字符串模擬模式:

print "Hey !!" 
> [simulated] Hey!! 

我不知道如何下手,如果有可能超載print

+0

您將需要創建自己的打印函數來檢查微控制器是否在模擬器中,如果是,則添加必要的前綴。 – Ryan

+0

好吧,但有可能超載打印? (像運營商) – Katsu

+0

@Katsu你不能超載打印作爲一個聲明,你必須自己做一個功能。 –

回答

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 !! 
+0

謝謝!你回答了我的問題 – Katsu

0

我會建議你千萬不要用在真正的代碼,這種方法前言這個答案。然而,爲了完整性(並且它回答了原始問題),我想我會在這裏添加它。

因此,您可以通過重定向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建議的方法。