<p>听起来好像您在谈论<a href="http://en.wikipedia.org/wiki/Monkey_patch" rel="nofollow">monkeypatching</a>导入的代码,因此导入该包的其他模块也将看到您的运行时修改。(如果我错了,请纠正我;你的问题中有几点我没有完全听懂)</p>
<p>对于简单的包导入,这应该可以:</p>
<pre><code>import my_package
def method_override():
return "Foo"
my_package.some_method = method_override
</code></pre>
<p>在本例中,<code>my_package</code>引用导入的模块,而不仅仅是本地名称,因此其他模块将看到重写的方法。在</p>
<p>这在其他代码已经完成的情况下不起作用</p>
^{pr2}$
<p>因为在这种情况下,<code>some_method</code><em>是导入位置的本地名称。如果在其他地方替换该方法,则不会看到该更改。在</p>
<p>如果发生这种情况,则需要更改源代码以导入整个模块,或者通过替换方法内部构件来修补更深一点的内容:</p>
<pre><code>import my_package
def method_override():
return "Foo"
my_package.some_method.func_code = method_override.func_code
</code></pre>
<p>此时,该方法在任何其他模块中是如何导入的都无关紧要;与该方法关联的code对象已被替换,新代码将运行,而不是原来的代码。在</p>
<p>在这种情况下,唯一需要担心的是,在每种情况下,模块都是从同一路径导入的。Python解释器将尝试重用现有模块,而不是重新导入和重新初始化它们,只要它们是从同一路径导入的。在</p>
<p>但是,如果您的python路径设置为包含两个目录,例如:'/foo'和'/foo/bar',那么这两个导入</p>
<pre><code>from foo.bar import baz
</code></pre>
<p>以及</p>
<pre><code>from bar import baz
</code></pre>
<p>最终将加载模块两次,并在模块中定义任何对象(方法、类等)的两个版本。如果发生这种情况,那么修补其中一个不会影响另一个。在</p>
<p>如果你需要防范这种情况,那么你可能需要穿越系统模块,查找导入的包,并修补找到的每个版本。当然,只有在所有其他导入都已经发生的情况下,这才有效,您不能先发制人(不编写导入钩子,但这又是一个更深层次的问题:)</p>
<p>你确定你不能把原来的包分叉直接扩展吗?这样会容易得多:)</p>