实现复制方法的最佳实践

pao*_*f89 7 python

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'

Jon*_*ler 6

您应该实现该__copy__方法,也可能__deepcopy__.文件说明:

为了让类定义自己的副本实现,它可以定义特殊的方法__copy__()__deepcopy__().前者被称为实现浅拷贝操作; 没有传递其他参数.调用后者来实现深拷贝操作; 它传递了一个参数,即备忘录字典.如果__deepcopy__()实现需要对组件进行深层复制,则应该deepcopy()以组件作为第一个参数并将备注字典作为第二个参数来调用该函数.

话虽如此,除非你做一些魔术(例如C分配,或调用statefull C库),你不需要__copy__自己实现,但是python免费提供给你,你可以简单地调用copy.copy(myobject)

  • 很好,谢谢您的建议,但这并没有解释如何实现该方法。 (2认同)

Sim*_*ans 6

你有一个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__深拷贝的方法。

我希望你明白这一点,这是我关注的链接


Red*_*yed 5

遵循实现只是复制,而不调用 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)