我想对一个类的所有实例进行深层复制,但不复制给定类的定义和规则。
预期用途是,假设我有“OriginalClass”类,它的实例是我存储的变量。当程序继续时,我希望能够使用之前的OriginalClass“快照”,我将只使用这些值(我不会在那里存储新的值,因此不需要继承任何规则)。
以上简单示例有效,与我想要做的非常相似:
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"
但想法是替代:
VMPast=copy.deepcopy(VM1)
对于工作代码,我不知道如何编写,这将复制实例和字典,但不复制定义。
原因是,在我的程序中使用deepcopy版本时(这样:)
VMPast=copy.deepcopy(VM1)
VM1.MyMethod(VMPast.MyButton[-1])
它会抛出以下错误:
AttributeError: AttributeSetter instance has no __call__ method
因为值:
VMPast.MyButton[-1]
发送时间为:
'__deepcopy__'
而不是我想要的实际替换值...(按钮),所以如果VMPast已经是VM中实例的工作副本,那么返回 deepcopy 就会有效! 另一件事是,实例是动态的,我事先并不知道原始类在那一刻会有的名称或值。 非常感谢你!
答案 0 :(得分:1)
深层副本从不复制类定义,只复制实例属性。
它改为创建一个新实例。 Python实例只将引用包含在类定义中。只需在该实例上调用MyMethod
:
VMPast.MyMethod()
如果班级有这样的方法。
您的特定类会阻止成功进行深层复制:
class VariableManagerClass:
def __getattr__(self, attr):
return AttributeSetter(self, attr)
copy.deepcopy()
函数在实例上查找.__deepcopy__()
方法,而您的__getattr__
挂钩则返回AttributeSetter
类。
您可以通过首先测试attr
来阻止这种情况:
class VariableManagerClass:
def __getattr__(self, attr):
if attr.startswith('_'):
raise AttributeError(attr)
return AttributeSetter(self, attr)
这表示您的类不处理私有属性或特殊方法名称。
答案 1 :(得分:0)
如果您只关心类的值(属性),我认为您可以调用__dict__
方法来获取它们。
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'}
如果这是询问,这是一个相关的问题:List attributes of an object