动态添加功能到现有的导入模块
Posted
技术标签:
【中文标题】动态添加功能到现有的导入模块【英文标题】:dynamically adding a function to existing imported module 【发布时间】:2015-10-20 15:15:40 【问题描述】:这可能是一个非常幼稚的问题,也许最好用一个例子来问:
module1.py
import module2
def new_func():
print(var_string)
module2.new_func = new_func
module2.func()
module2.new_func()
module2.py
var_string = "i'm the global string!"
def func():
print(var_string)
结果
> python module1.py
i'm the global string!
Traceback (most recent call last):
File "module1.py", line 8, in <module>
module2.new_func()
File "module1.py", line 4, in new_func
print(var_string)
NameError: name 'var_string' is not defined
所以我的问题是: 是否可以将函数插入模块并相应地更新其全局命名空间?
相关:global variable defined in main script can't be accessed by a function defined in a different module 请注意,我知道共享全局变量是一个坏主意,而且我也知道配置模块将是一个很好的折衷方案,但也请注意,这不是我想要实现的目标。
【问题讨论】:
他们没有必要这样做。您可以只使用 if 语句来确定调用哪个方法,或者将哪些参数传递给方法。等等…… 我不同意。我认为这将非常有用。类比是向现有类动态添加一个方法,该类利用该类的其他属性和方法。我还希望这个插入的函数可以被其他模块调用。本质上,我是在动态扩展模块,而不需要对模块的源代码进行物理编辑。 你需要把 print(var_string) 改成 print(module2.var_string) @DamiánMontenegro 不,这不是我要找的。我希望 func 可以直接访问 module2 的全局成员,就好像它最初是在 global2 中定义的一样。 我从来没有这样做过。但是方法是否覆盖了您所说的内容?看看这个链接lgiordani.com/blog/2014/05/19/method-overriding-in-python/… 【参考方案1】:您可能认为它很有用,但很少有 Python 代码是这样编写的,我认为大多数 Python 程序员都会对这样做的代码感到困惑。在导入后修改模块(monkeypatching)通常被看不起,因为它很容易做错事并导致奇怪的错误。
您将其与类上的覆盖/扩展方法进行了类比,但如果这确实是您想要做的,为什么不直接使用类呢?类的特性使得做这种事情变得更安全、更容易。
如果您这样做,您的代码将起作用:
from module2 import var_string
#or..
from module2 import *
但我不确定这是否是您正在寻找的解决方案。无论哪种方式,我个人都不会尝试让这段代码工作,它与 Python 代码的正常编写方式作斗争。如果您有一个您认为可以通过动态修改模块来改进的实际代码示例,我希望看到它。您提供的示例代码有点难以看出好处。
【讨论】:
公平点。一些上下文:我正在使用日志记录模块,我想向模块添加一个函数(它使用模块中的其他东西),然后我可以从我的应用程序中的其他模块引用它。这是促使我提出这个问题的原始问题。 ***.com/questions/31701470/…【参考方案2】:我不明白你想要什么,以及这个字符串必须做什么“module2.new_func = new_func”,因为你没有函数 new_funcin module2。 但是如果你想在每个模块中重置变量,你不能这样使用:
模块1:
import module2
def new_func():
print(var_string)
new_class=module2.MyStuff()
var_string=new_class.func()
new_func()
模块2:
class MyStuff:
def __init__(self):
self.var_string = "i'm the global string!"
def func(self):
print(self.var_string)
return self.var_string
【讨论】:
以上是关于动态添加功能到现有的导入模块的主要内容,如果未能解决你的问题,请参考以下文章
将带有分页的 UIScrollView 添加到现有的 UIViewController