如何将所有python实例复制到新类?

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实例只包含对类定义的引用。在这种情况下,只需调用MyMethod

1
VMPast.MyMethod()

前提是类具有此类方法。

正是您的特定类阻止了成功的深度复制:

1
2
3
class VariableManagerClass:
    def __getattr__(self, attr):
        return AttributeSetter(self, attr)

copy.deepcopy()函数在实例上查找.__deepcopy__()方法,而您的__getattr__钩子则返回AttributeSetter类。

您可以先测试一下您的attr,以防止出现这种情况:

1
2
3
4
5
class VariableManagerClass:
    def __getattr__(self, attr):
        if attr.startswith('_'):
            raise AttributeError(attr)
        return AttributeSetter(self, attr)

这表示类不处理私有属性或特殊方法名。


如果您只关心类的值(属性),我想您可以调用__dict__方法来获取这些值。

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'}

如果这就是问题所在,这里有一个相关的问题:列出对象的属性