首页 > 解决方案 > 从父类覆盖子类中的打印功能

问题描述

我想知道是否有一种方法可以覆盖父类的子类中使用的python 3.x中的内置打印函数?那可能吗?

标签: python-3.x

解决方案


  1. 我无法找到 的真正定义builtins.print,但这是我将如何覆盖:
class ViewSpy:
    last_message = ""
    
    def print(self, *args, sep=' ', end='\n'):
        self.last_message = sep.join(map(str, args)) + end

要更改v.print基于布尔值的行为:

import builtins

# ... set should_unittest variable here 

if should_unittest:
    v = ViewSpy()
else:
    v = builtins
v.print("nothing")

通过ViewSpy模拟实现builtins.print,并将输出存储到一个字段中,以便我们可以自动测试它。

def test_view_spies():
    v = ViewSpy()
    v.print("nothing")
    assert v.last_message == "nothing\n"

    v.print("something")
    assert v.last_message == "something\n"

    v.print("John", "Smith")
    assert v.last_message == "John Smith\n"

    v.print("apples", 24, "grapes", "bananas", sep=',')
    assert v.last_message == "apples,24,grapes,bananas\n"

    v.print("Automated testing is fun", end='!!!')
    assert v.last_message == "Automated testing is fun!!!"

    v.print("Maybe, you don't need a new line", end='')
    assert v.last_message == "Maybe, you don't need a new line"

  1. 鉴于主持人
class Presenter:
    def __init__(self, view):
        self.view = view

    def present_sentence(self, response_model):
        self.view.print(*map(self.__convert_container_to_str, response_model))

    @staticmethod
    def __convert_container_to_str(each_character_as_array_element):
        return "".join(each_character_as_array_element)

现在我们可以读取p.present_sentence发送到控制台的内容并自动测试它

def test_present_sentence():
    view = ViewSpy()
    p = Presenter(view)
    p.present_sentence(({'ь', 'е', 'с', 'Д', 'В', 'л', 'а'}, {'М', 'у', 'и', 'р', 'а', 'н'},
                        {'п', 'х', 'к', 'у', 'т', 'о', 'л', 'а', 'с'},
                        {'и', 'д', 'н', 'ч', 'у', 'з', 'ж', 'о', 'л', 'а', 'с'}, {'х', 'у', 'т', 'а', 'м'},
                        {'в', 'е', 'с'}, {'в', 'е', 'и', 'ж'}, {'в'}, {'х', 'т', 'i', 'а'}, {'в', 'о', 'з', 'н'},
                        {'и', 'л', 'ж', 'о'}, {'п', 'ь', 'и', 'р', 'н', 'к', 'у', 'о', 'л', 'с'},
                        {'ш', 'i', 'у', 'з', 'о', 'л', 'а', 'м'}, {'i', 'г', 'н', 'з', 'о', 'л', 'а', 'м'}))

    printed_words = view.last_message.split()
    first_word = view.last_message.split()[0]
    assert len(printed_words) == 14

    assert len(first_word) == 7
    for letter in first_word:
        assert letter in {'ь', 'е', 'с', 'Д', 'В', 'л', 'а'}

    assert view.last_message[-1] == '\n'
    assert view.last_message[13] != ' '
    assert view.last_message[14] == ' '
    assert view.last_message[15] != ' '

    third_word = printed_words[2]
    assert len(third_word) == 9
    for letter in third_word:
        assert letter in {'п', 'х', 'к', 'у', 'т', 'о', 'л', 'а', 'с'}

__init__.py我们编写以下代码以实际将消息打印到控制台中,并且不存储日志。

import builtins

#...

p = Presenter(builtins)

推荐阅读