擅长:python、mysql、java
<p>我不知道您的情况,但我通常不喜欢将<code>types</code>用于除类型检查之外的任何事情(我不经常这样做;-)。我宁愿<code>inspect</code>。。。在</p>
<p>我必须在这段代码的开头说,我希望您有一个很好的理由来做这件事;—)对我来说,似乎仅仅是子类化和重写类属性就可以更优雅地完成这项工作。。。但是,如果你真的想复制一个类,为什么不在新的命名空间中再次执行它的源代码呢?在</p>
<p>我将以下简单模块组合在一起:</p>
<pre><code># test.py
# Just some test data
FOO = 1
class Bar(object):
def subclass_method(self):
print('Hello World!')
class Foo(Bar):
def method(self):
return FOO
</code></pre>
<p>然后做些重活:</p>
^{pr2}$
<p>这可能有一些可取的性质和不可取的。。。首先,它只适用于可检查的类。这几乎是用户定义的任何东西,所以可能不是限制性的。。。它也可能比其他不需要重新解析源字符串的解决方案慢一点,但同样,它似乎不应该经常执行<em>太</em>,所以这可能没问题。在</p>
<p>现在的“优势”。。。在</p>
<ol>
<li>如果一个函数请求了一个全局,但没有提供,那么它将使用旧命名空间中的全局。如果这种行为不可取(即您宁愿使用<code>NameError</code>),您可以很容易地修改函数来删除它。在</li>
<li>“副本”不是从原始文件继承的。在大多数情况下,这可能并不重要,但有一个东西的副本从原来的继承有点奇怪。。。在</li>
</ol>
<hr/>
<p>有些人可能看到这里的<code>exec</code>,马上就会想:“哦,不!<code>exec</code>!?!?!世界就要结束了!!!”。弗兰基,这是个不错的默认回答。但是,我认为,如果您要复制一个计划在稍后的代码中使用的函数,那么它并不比使用<code>exec</code>更安全(毕竟,该函数的代码已经执行)。在</p>