python-3.x - 从父类覆盖子类中的打印功能
问题描述
我想知道是否有一种方法可以覆盖父类的子类中使用的python 3.x中的内置打印函数?那可能吗?
解决方案
- 我无法找到 的真正定义
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"
- 鉴于主持人
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)
推荐阅读
- java - 为什么java附加给我一个错误?
- node.js - 我不确定我是否正在编写正确的 json 返回
- swift - swiftUI 编译器无法对此进行类型检查...当尝试使用来自服务器 API 的数据时
- python - TypeError:“模块”对象不可下标(Pytorch)
- flutter - 如何使定位小部件的子级未绑定到定位小部件
- java - 如何覆盖 Java 的 jpackage wix 默认值以创建包含安装位置的环境变量?
- javascript - 在快速解决承诺之前发送响应是否有任何警告?
- postgresql - Postgres 12 - CREATE AGGREGATE 看起来正确,但结果永远不会返回
- angular - ngx-editor 可以在工具栏上添加新标签按钮或设置类名
- .htaccess - html分页的正确规则