How to copy all python instances to a new class?
我想对一个类的所有实例进行深度复制,但不复制给定类的定义和规则。
预期用途是,如果我有一个类"originalClass",它的实例就是我正在存储的变量。当程序继续运行时,我希望能够使用OriginalClass以前的"快照",从中我将只使用值(我不会在那里存储新的值,因此不需要继承任何规则)。
上面的简单示例很有效,与我想做的非常相似:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import copy class VM: #nothing in the class pass VM1=VM() VM1.test=dict() VM1.test['one']="hello" def printmytext(VMPast=copy.deepcopy(VM1)): g.es(VMPast.test['one']) VM1.test="Bye" printmytext() #Returns"hello" |
但其想法是替代:
1 | VMPast=copy.deepcopy(VM1) |
对于工作代码,我不知道如何编写,它将复制实例和字典,但不复制定义。
原因是,在我的程序中使用deepcopy版本时(这种方式:)
1 2 | VMPast=copy.deepcopy(VM1) VM1.MyMethod(VMPast.MyButton[-1]) |
它引发以下错误:
1 | AttributeError: AttributeSetter instance has no __call__ method |
因为:
1 | VMPast.MyButton[-1] |
发送为:
1 | '__deepcopy__' |
而不是实际的替代值,我想…(按钮),所以如果vmpass已经是vm中实例的工作副本,那么这将在返回deepcopy时起作用!另一件事是,实例是动态的,我事先不知道原始类在那一刻将拥有的名称或值。非常感谢你!
深度复制从不复制类定义,只复制实例属性。
而是创建一个新实例。python实例只包含对类定义的引用。在这种情况下,只需调用
1 | VMPast.MyMethod() |
前提是类具有此类方法。
正是您的特定类阻止了成功的深度复制:
1 2 3 | class VariableManagerClass: def __getattr__(self, attr): return AttributeSetter(self, attr) |
您可以先测试一下您的
1 2 3 4 5 | class VariableManagerClass: def __getattr__(self, attr): if attr.startswith('_'): raise AttributeError(attr) return AttributeSetter(self, attr) |
这表示类不处理私有属性或特殊方法名。
如果您只关心类的值(属性),我想您可以调用
1 2 3 4 5 6 7 8 9 10 11 12 | In [1]: class Foo(): ...: pass ...: In [2]: foo = Foo() In [3]: foo.bar1 = 'derp' In [4]: foo.bar2 = 'derp derp' In [5]: foo.__dict__ Out[5]: {'bar1': 'derp', 'bar2': 'derp derp'} |
如果这就是问题所在,这里有一个相关的问题:列出对象的属性