Как переопределить copy/deepcopy операции для объекта Python?

страница MSDN на анонимных методах объясняет его

В версиях C# прежде 2.0, единственный способ объявить, что делегат должен был использовать названные методы. C# 2.0 представил анонимные методы и в C# 3.0 и позже, лямбда-выражения заменяют анонимные методы как предпочтительный способ записать встроенный код. Однако информация об анонимных методах в этой теме также относится к лямбда-выражениям. Существует один случай, в котором анонимный метод обеспечивает функциональность, не найденную в лямбда-выражениях. Анонимные методы позволяют Вам опустить список параметров, и это означает, что анонимный метод может быть преобразован в делегатов со множеством подписей. Это не возможно с лямбда-выражениями. Для получения дополнительной информации конкретно о лямбда-выражениях, посмотрите Лямбда-выражения (Руководство по программированию C#).

И относительно лямбда-выражений :

лямбда-выражение А является анонимной функцией, которая может содержать выражения и операторы, и может использоваться для создания типов дерева выражений или делегатов. Все лямбда-выражения используют оператор лямбды =>, который читается, поскольку "переходит в". Левая сторона оператора лямбды определяет входные параметры (если таковые имеются), и правая сторона содержит выражение или блок операторов. Лямбда-выражение x => x * x читается "x, переходит к x временам, x." Этих выражений могут быть присвоены типу делегата следующим образом:

82
задан Eino Gourdin 22 November 2019 в 11:08
поделиться

2 ответа

Рекомендации по настройке находятся в самом конце страницы документации :

Классы могут использовать одни и те же интерфейсы для контролировать копирование, которое они используют для контроль травления. Смотрите описание модуля pickle для получения информации о эти методы. Модуль копирования делает не использовать регистрацию copy_reg модуль.

Чтобы класс мог определить свой собственный копировать реализацию, он может определять специальные методы __ copy __ () и __ deepcopy __ () . Первый призван реализовать мелкую копию операция; никаких дополнительных аргументов нет прошло. Последний призван реализовать операцию глубокого копирования; Это передается один аргумент, памятка Словарь. Если __ deepcopy __ () реализация должна сделать глубокий копия компонента, она должна вызывать функция deepcopy () с компонент в качестве первого аргумента и мемо-словарь в качестве второго аргумента.

Поскольку вы, похоже, не заботитесь о настройке травления, определение __ copy __ и __ deepcopy __ определенно кажется правильным путем для вас.

В частности, для вас. , __ copy __ (мелкая копия) в вашем случае довольно просто ...:

def __copy__(self):
  newone = type(self)()
  newone.__dict__.update(self.__dict__)
  return newone

__ deepcopy __ будет аналогичным (принятие аргумента memo arg), но до возврата ему пришлось бы вызвать self.foo = deepcopy (self.foo, memo) для любого атрибута self.foo , который требует глубокого копирования (по сути, атрибуты, которые являются контейнерами - списки, dicts , непримитивные объекты, которые содержат другие данные через свои __ dict __ s).

68
ответ дан 24 November 2019 в 09:11
поделиться

Я могу немного сбиться с толку, но здесь идет;

Из копии docs ;

  • Мелкая копия создает новый составной объект, а затем (насколько это возможно) вставляет в него ссылки на объекты, найденные в оригинале.
  • Глубокая копия конструирует новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.

Другими словами: copy () скопирует только верхний элемент, а остальные оставит в качестве указателей на исходную структуру. deepcopy () будет рекурсивно копировать все.

То есть, deepcopy () - это то, что вам нужно.

Если вам нужно сделать что-то действительно конкретное, вы можете переопределить __ copy __ () или __ deepcopy __ () , как описано в руководстве. Лично я

6
ответ дан 24 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: