作者:小东东5201314 | 来源:互联网 | 2023-01-29 19:34
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'}
我发现五年前的帖子提示了以下方式:
import copy
def copy(self):
return MyClass(copy.copy(self.foo), copy.copy(self.bar))
它仍然是唯一的方法,还是有其他可能性?
我需要创建一个对象的副本,以避免函数更改原始对象.功能是这样的:
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)
以下代码的输出是"Ciao","Ciao"但应该是"Ciao","Hello"
mc = MyClass('Hello')
translate_and_print(mc)
print(mc.foo)
如果我使用该copy()
方法,我有错误:
AttributeError:'MyClass'对象没有属性'copy'
Jonas Adler..
6
您应该实现该__copy__
方法,也可能__deepcopy__
.文件说明:
为了让类定义自己的副本实现,它可以定义特殊的方法__copy__()
和__deepcopy__()
.前者被称为实现浅拷贝操作; 没有传递其他参数.调用后者来实现深拷贝操作; 它传递了一个参数,即备忘录字典.如果__deepcopy__()
实现需要对组件进行深层复制,则应该deepcopy()
以组件作为第一个参数并将备注字典作为第二个参数来调用该函数.
话虽如此,除非你做一些魔术(例如C分配,或调用statefull C库),你不需要__copy__
自己实现,但是python免费提供给你,你可以简单地调用copy.copy(myobject)
1> Jonas Adler..:
您应该实现该__copy__
方法,也可能__deepcopy__
.文件说明:
为了让类定义自己的副本实现,它可以定义特殊的方法__copy__()
和__deepcopy__()
.前者被称为实现浅拷贝操作; 没有传递其他参数.调用后者来实现深拷贝操作; 它传递了一个参数,即备忘录字典.如果__deepcopy__()
实现需要对组件进行深层复制,则应该deepcopy()
以组件作为第一个参数并将备注字典作为第二个参数来调用该函数.
话虽如此,除非你做一些魔术(例如C分配,或调用statefull C库),你不需要__copy__
自己实现,但是python免费提供给你,你可以简单地调用copy.copy(myobject)