2014-01-18 67 views
3

我們假設我有兩個模塊a.pyb.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 = 'FOOBAR' 
>>>a.Original.name == 'FOOBAR' 
True 

所以我的問題是如何做一個真正的副本?

+1

模塊只加載一次,每個類只創建一次類變量。 – thefourtheye

+2

你爲什麼想這樣做? – geekazoid

+1

看起來你正在嘗試使用模塊,比如可能通常使用類。類支持多個實例,但模塊不支持。 –

回答

1

我認爲你必須更新的globals()deepcopyglobals()字典b.pya.py。因爲我們不能使用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 

請注意,我們不使用用於上述目的的模塊,一類是這樣的事情的工具。

0

你可以做的是這樣的:

鑑於a.py爲:

var = 123 

你可以這樣做:

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

你不能,然而,實施B中自己的模塊。