Copy.deepcopy против создания новых экземпляров в магических методах - PullRequest
0 голосов
/ 25 октября 2018

Когда переписываете python add , mul и т.д. магическими методами, кажется нормальным создавать новый экземпляр класса и затем возвращать его.Например:

class test_class_simple:
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        return test_class(self.x + other.x)

Однако другой вариант заключается в том, чтобы метод add скопировал существующий экземпляр, а затем просто изменил его значение:

import copy
def __add__(self, other):
    new = copy.deepcopy(self)
    new.x = self.x + other.x
    return new

При работесо сложными классами с большим количеством переменных кажется более простым и, вероятно, также более безопасным их глубокое копирование (как в примере 2) и затем изменение конкретного атрибута, на который влияет магический метод.Однако я не вижу много примеров того, как люди делают это, и поэтому мне интересно, есть ли какой-то недостаток к этому дальше по линии, о которой я не знаю.Есть ли вред этому подходу?

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2018

Я бы пошел с твоим первым способом переопределения __add__.Несколько причин, почему:

  • copy.deepcopy() написано на Python, а не на C, поэтому вы, вероятно, не получите никакого выигрыша в производительности от этого
  • Использование copy.deepcopy()не так ясно, как просто создание нового объекта, потому что объект, возвращаемый __add__, не имеет прямой связи с текущим объектом
  • Если объект, который вы создаете, имеет какой-то вид-referential цикл, copy.deepcopy() может застрять, так как он использует рекурсию, чтобы сделать глубокое копирование.
...