Python 如何复制模块

Python 如何复制模块,python,module,package,Python,Module,Package,假设我有两个模块a.py和b.pyb应该是a的副本。 假设这是a的内容: #a.py class Original(object): name = 'original' 复制a最明显的方法如下: #b.py from a import * 但这并不是真正复制a,例如 >>>import a, b >>>#this changes a.Original.name as well >>>b.Original.name = 'FOOBA

假设我有两个模块
a.py
b.py
<代码>b应该是
a
的副本。 假设这是
a
的内容:

#a.py
class Original(object):
    name = 'original'
复制
a
最明显的方法如下:

#b.py
from a import *
但这并不是真正复制
a
,例如

>>>import a, b
>>>#this changes a.Original.name as well
>>>b.Original.name = 'FOOBAR'
>>>a.Original.name == 'FOOBAR'
True

所以我的问题是如何制作真正的拷贝?

您可以做的是:

给定的
a.py
为:

var = 123
你可以做:

>>> import a
>>> b = a
>>> b.var = 1234
>>> a.var
1234

但是,您不能将b作为自己的模块来实现。

我认为您必须使用
a.py
中的
globals()
deepcopy
更新
globals()
字典。由于我们无法使用
deepcopy
复制类对象,因此,您将使用
type()
a.py
中的所有类创建一个新类

from copy import deepcopy
import types
import a

def class_c(c):
    #To create a copy of class object
    return type(c.__name__, c.__bases__, dict(c.__dict__))

filtered_a_dict = {k:v for k, v in a.__dict__.items()
                                   if not (k.startswith('__') and k.endswith('__'))}

globals().update({k:deepcopy(v) if not isinstance(v, types.TypeType) 
                               else class_c(v) for k, v in filtered_a_dict.items()})

del a
演示:

>>> import a, b
>>> b.Original.name = 'bar'
>>> a.Original.name == 'bar'
False

请注意,我们不会将模块用于此类目的,类是用于此类目的的正确工具。

模块仅加载一次,而类变量仅为每个类创建一次。您为什么要这样做?您似乎试图使用模块,就像通常使用类一样。类支持多个实例,但模块不支持。