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
请注意,我们不会将模块用于此类目的,类是用于此类目的的正确工具。模块仅加载一次,而类变量仅为每个类创建一次。您为什么要这样做?您似乎试图使用模块,就像通常使用类一样。类支持多个实例,但模块不支持。