覆盖当前类python3

时间:2018-09-19 15:49:52

标签: python python-3.x

不确定我将如何完成对print('something')函数的覆盖,从而在我所在的类中做其他事情。

例如,我有以下代码:

import app
from app.helper import ws_send

class TemplateSubJob:
    def __init__(self, sessiondata, sid, payload):
        self.session = sessiondata
        self.sid = sid
        self.payload = payload

    def startme(self):
        ws_send(self.sid, self.payload, 'Send some output to the user...')
        ws_send(self.sid, self.payload, 'Send something else to the user...')
        print('test')

        return b'xlsx_bytes_output'

我想重写函数print('something')以获取传递的内容并对其进行处理。

在我的情况下,我想创建一个打印功能,该功能可以执行ws_send()的操作,但只接受一个字符串即可。

类似以下内容:

def print(string):
    ws_send(self.sid, self.payload, string)

print('now i am being sent through ws_send instead of stdout')

我该怎么做?

更新:

这样做的原因是,向我添加代码的任何人都无需修改其代码或脚本即可使用我的功能。我可以劫持他们已经在使用的打印功能。

3 个答案:

答案 0 :(得分:0)

您可以使用以下语法重载打印功能:

from __future__ import print_function
try:
    # python2
    import __builtin__
except ImportError:
    # python3
    import builtins as __builtin__


def print(*args, **kwargs):
    __builtin__.print('New print function')
    return __builtin__.print(*args, **kwargs)

E:如评论中指出的那样,修复了错误的导入

答案 1 :(得分:0)

要将打印重定向到变量(字符串),请使用以下方法:

from io import StringIO # Python2 use: from cStringIO import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()

# blah blah lots of code ...

sys.stdout = old_stdout

# examine mystdout.getvalue()

来源:https://stackoverflow.com/a/1218951/4718434

要将其重定向到文件,请使用以下命令:

https://stackoverflow.com/a/4675744/4718434

答案 2 :(得分:0)

所以我不打算在给定的情况下使用打印语句的原因,但是对于 Python 3,在您的类描述中

class TemplateSubJob:
    def __init(self, ):
        # and other methods

    def __str__(self, ):
      return 'String description here'

当有人试图打印给定的对象时,它将返回给定的字符串。例如,当我实例化时,我可以在实例化之后直接调用print函数,它会返回上面str函数返回的任何字符串

    myobject = TemplateSubJob()
    print(myobject)