все 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Сообщить о неточности