当前位置: 首页 > 面试题库 >

使用from…import的覆盖模块方法

严狐若
2023-03-14
问题内容

我有问题要覆盖使用from … import语句的方法。一些例子来说明这个问题:

# a.py module
def print_message(msg):
    print(msg)

# b.py module
from a import print_message
def execute():
    print_message("Hello")

# c.py module which will be executed
import b
b.execute()

我想重写print_message(msg)方法而不更改a或b模块中的代码。我尝试了很多方法,但是从… import导入了原始方法。当我将代码更改为

import a
a.print_message

比我看到的改变。

你能建议我如何解决这个问题吗?
预先感谢您的任何小例子。

最好的祝福

------------------更新------------------
我试图这样做,例如:

# c.py module
import b
import a
import sys
def new_print_message(msg):
    print("New content")
module = sys.modules["a"]
module.print_message = new_print_message
sys.module["a"] = module

但这在我使用for … import语句的地方不起作用。仅适用于导入a,但是正如我写的那样,我不想更改b.py和a.py模块中的代码。


问题答案:

在不修改ab模块的情况下,您可以尝试执行c以下操作:

import a

def _new_print_message(message):
    print "NEW:", message

a.print_message = _new_print_message

import b
b.execute()

您必须先导入a,然后覆盖函数,然后再导入,b以便它将使用a已导入(和更改)的模块。



 类似资料:
  • 如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用from sys import argv语句。如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用from..import而使用import语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。

  • 5.2. 使用 from module import 导入模块 Python 有两种导入模块的方法。两种都有用,你应该知道什么时候使用哪一种方法。一种方法, import module,你已经在第 2.4 节 “万物皆对象”看过了。另一种方法完成同样的事情,但是它与第一种有着细微但重要的区别。 下面是 from module import 的基本语法: from UserDict import

  • 问题内容: 在这个有用的问答中,我看到了一个可以使用的问题,或者在Python 3中,。 我的问题是,如果我说要进口怎么办?那我使用的时候就不用指了。你们会因为把整个模块扔到全局名称空间中而对我大喊大叫吗?:) 问题答案: 我同意 “一般不要这样做”的 共识,但是… 正确答案是:

  • 我有个问题 我看到: @导入vs#导入-iOS7 我把“启用模块”设置为“是” 我的问题没有解决

  • 认识模块 对于模块,在前面的一些举例中,已经涉及到了,比如曾经有过:import random (获取随机数模块)。为了能够对模块有一个清晰的了解,首先要看看什么模块,这里选取官方文档中对它的定义: A module is a file containing Python definitions and statements. The file name is the module name wi

  • 我有一个多模块项目,我似乎无法在Sonarqube上获得准确的单元测试代码覆盖率报告。我使用buildr和JaCoCo生成测试覆盖率。文件继承类似于下面。 项目--module1----reports----Jacoco------Jacoco.cov(jacoco执行文件,以前用作.exec)--module2--reports----Jacoco(生成的HTML、CSV和XML报表文件)---