类的继承和定制

时间:2014-05-16 14:14:37

标签: python python-2.7

我定义了一个具有许多子类的类Device,例如Microcontroller

设备有两种模式,特别是"模拟"模式。

我正在尝试对Device类进行编码,如果Microcontroller处于模拟模式,那么当执行打印时,它应该在字符串前加[simulated]

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

我不知道如何开始,以及是否可能超载print

2 个答案:

答案 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建议的方法。