覆盖当前类python3中的打印方法

问题描述 投票:0回答:3

不确定如何完成覆盖 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')

我怎样才能做到这一点?

更新:

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

python python-3.x
3个回答
6
投票

您可以使用以下语法重载打印函数:

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:修复了错误的导入,如评论中指出的那样


3
投票

所以我不会详细解释为什么在给定情况下使用 print 语句,但对于 Python 3,在类描述中

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

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

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

    myobject = TemplateSubJob()
    print(myobject)

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.