如何复制一个python类?

copy deepcopy copy不复制类:

 >>> class A(object): >>> ARG = 1 >>> B = deepcopy(A) >>> A().ARG >>> 1 >>> B().ARG >>> 1 >>> A.ARG = 2 >>> B().ARG >>> 2 

只有这样吗?

 B(A): pass 

一般来说,inheritance是正确的,正如其他海报已经指出的那样。

然而,如果你真的想用不同的名字重新创build相同的types,并且没有inheritance,那么你可以这样做:

 class B(object): x = 3 CopyOfB = type('CopyOfB', B.__bases__, dict(B.__dict__)) b = B() cob = CopyOfB() print bx # Prints '3' print cob.x # Prints '3' bx = 2 cob.x = 4 print bx # Prints '2' print cob.x # Prints '4' 

你必须小心可变的属性值:

 class C(object): x = [] CopyOfC = type('CopyOfC', C.__bases__, dict(C.__dict__)) c = C() coc = CopyOfC() cxappend(1) coc.x.append(2) print cx # Prints '[1, 2]' (!) print coc.x # Prints '[1, 2]' (!) 

正如你猜测的那样,“复制”一个class级的正确方式是inheritance:

 class B(A): pass 

你可以使用工厂function:

 def get_A(): class A(object): ARG = 1 return A A = get_A() B = get_A() 

我想你在这里误解了静态variables的含义。 每一个你在方法外部声明一个variables,而不是以self.some_thing的formsself.some_thingvariables将被视为类的静态variables(像你的ARGvariables)。 因此,更改静态variables的Class的每个对象(实例)都将导致相同Class中的所有其他对象发生更改。 deepcopy在这里真的做这份工作。

创build自己的构造函数,然后重复如何创build原始类:

 class MyClass(object): def __init__(self, **kw): self.kw = kw self.__dict__.update(kw) def copy(self): return MyClass(**self.kw) 

我会尽量避免首先复制对象的需要。


旁注:你也可以做到:

 B = deepcopy(A) B.__dict__ = deepcopy(A.__dict__) 

但这可能是非常错误的,你不应该这样做。 编辑:实际上是AttributeError: 'dictproxy' object has no attribute 'update'根据OP, AttributeError: 'dictproxy' object has no attribute 'update'

如果你想创build一个类的另一个实例,那么只需要:

  >>> class A(object): ... ARG=1 ... >>> a = A() >>> A().ARG 1 >>> b = A() >>> b.ARG 1 >>> a.ARG=2 >>> b.ARG 1