Python Glossary English

все Python 3copyпонятие

Протокол копирования

кастомизация

Методы для настройки поведения copy.copy() и copy.deepcopy() в пользовательских классах.

Синтаксис

def __copy__(self): ...
def __deepcopy__(self, memo): ...

Определять их нужно редко: по умолчанию copy восстанавливает объект из его __dict__, и этого хватает почти всегда — руками пишут, когда объект держит несопируемый ресурс (сокет, дескриптор файла, соединение) или кэш, который в копии должен быть пустым. В __deepcopy__ обязательно сначала положите новый объект в memo под ключом id(self), а вложенные поля копируйте как copy.deepcopy(x, memo) — иначе циклические ссылки уйдут в бесконечную рекурсию, а один и тот же общий подобъект скопируется дважды.

Примеры

import copy
class MyObj:
    def __init__(self, v): self.v = v
    def __copy__(self):
        return MyObj(self.v)
    def __deepcopy__(self, memo):
        return MyObj(copy.deepcopy(self.v, memo))
obj = MyObj([1,2])
c = copy.copy(obj)
c.v is obj.v # → True  (shallow)
d = copy.deepcopy(obj)
d.v is obj.v # → False

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности