如何复制一个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_thing
variables将被视为类的静态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