страница MSDN на анонимных методах объясняет его
В версиях C# прежде 2.0, единственный способ объявить, что делегат должен был использовать названные методы. C# 2.0 представил анонимные методы и в C# 3.0 и позже, лямбда-выражения заменяют анонимные методы как предпочтительный способ записать встроенный код. Однако информация об анонимных методах в этой теме также относится к лямбда-выражениям. Существует один случай, в котором анонимный метод обеспечивает функциональность, не найденную в лямбда-выражениях. Анонимные методы позволяют Вам опустить список параметров, и это означает, что анонимный метод может быть преобразован в делегатов со множеством подписей. Это не возможно с лямбда-выражениями. Для получения дополнительной информации конкретно о лямбда-выражениях, посмотрите Лямбда-выражения (Руководство по программированию C#).
И относительно лямбда-выражений :
лямбда-выражение А является анонимной функцией, которая может содержать выражения и операторы, и может использоваться для создания типов дерева выражений или делегатов. Все лямбда-выражения используют оператор лямбды =>, который читается, поскольку "переходит в". Левая сторона оператора лямбды определяет входные параметры (если таковые имеются), и правая сторона содержит выражение или блок операторов. Лямбда-выражение x => x * x читается "x, переходит к x временам, x." Этих выражений могут быть присвоены типу делегата следующим образом:
Рекомендации по настройке находятся в самом конце страницы документации :
Классы могут использовать одни и те же интерфейсы для контролировать копирование, которое они используют для контроль травления. Смотрите описание модуля 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).
Я могу немного сбиться с толку, но здесь идет;
Из копии
docs ;
- Мелкая копия создает новый составной объект, а затем (насколько это возможно) вставляет в него ссылки на объекты, найденные в оригинале.
- Глубокая копия конструирует новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
Другими словами: copy ()
скопирует только верхний элемент, а остальные оставит в качестве указателей на исходную структуру. deepcopy ()
будет рекурсивно копировать все.
То есть, deepcopy ()
- это то, что вам нужно.
Если вам нужно сделать что-то действительно конкретное, вы можете переопределить __ copy __ ()
или __ deepcopy __ ()
, как описано в руководстве. Лично я