copy在类中实现该方法的最佳实践是什么?
这是我班级的一个例子:
class MyClass:
def __init__(self, foo, bar=None):
self.foo = foo
if bar is not None:
self.bar = bar
else:
self.bar = {'Hello': 'Ciao'}
Run Code Online (Sandbox Code Playgroud)
我发现五年前的帖子提示了以下方式:
import copy
def copy(self):
return MyClass(copy.copy(self.foo), copy.copy(self.bar))
Run Code Online (Sandbox Code Playgroud)
它仍然是唯一的方法,还是有其他可能性?
我需要创建一个对象的副本,以避免函数更改原始对象.功能是这样的:
def translate_and_print(my_class, dict={'Hello':'Ciao'}):
temp = my_class # here I want to use the copy method: temp = my_class.copy()
temp.foo = temp.bar[temp.foo]
print(temp.foo)
Run Code Online (Sandbox Code Playgroud)
以下代码的输出是"Ciao","Ciao"但应该是"Ciao","Hello"
mc = MyClass('Hello')
translate_and_print(mc)
print(mc.foo)
Run Code Online (Sandbox Code Playgroud)
如果我使用该copy()方法,我有错误:
AttributeError:'MyClass'对象没有属性'copy'
您应该实现该__copy__方法,也可能__deepcopy__.文件说明:
为了让类定义自己的副本实现,它可以定义特殊的方法
__copy__()和__deepcopy__().前者被称为实现浅拷贝操作; 没有传递其他参数.调用后者来实现深拷贝操作; 它传递了一个参数,即备忘录字典.如果__deepcopy__()实现需要对组件进行深层复制,则应该deepcopy()以组件作为第一个参数并将备注字典作为第二个参数来调用该函数.
话虽如此,除非你做一些魔术(例如C分配,或调用statefull C库),你不需要__copy__自己实现,但是python免费提供给你,你可以简单地调用copy.copy(myobject)
你有一个AttributeError,我认为那是因为你只是创建了一个copy方法,而不是你需要创建__copy__方法。
import copy
class MyClass:
def __init__(self, name):
self.name = name
def __copy__(self):
return MyClass(self.name)
def __deepcopy__(self, memo):
return MyClass(copy.deepcopy(self.name, memo))
Run Code Online (Sandbox Code Playgroud)
__copy__浅拷贝和__deepcopy__深拷贝的方法。
我希望你明白这一点,这是我关注的链接
遵循实现只是复制,而不调用 init() 方法。
class MyClass(BaseClass):
def __init__(self, name):
super().__init__()
self.name = name
def __copy__(self):
obj = type(self).__new__(self.__class__)
obj.__dict__.update(self.__dict__)
return obj
Run Code Online (Sandbox Code Playgroud)