Как выборочно глубокое копирование в python? - PullRequest
1 голос
/ 06 июня 2019

У меня есть несколько классов Python. Объекты одного из классов (скажем, class1) содержат большое количество данных (они не будут изменены во время выполнения). Другой класс (скажем, class2) имеет переменную-член, которая отображается на один из объектов class1. Предположим, что в class1 и class2 есть и переменные, и переменные-члены.

Теперь я тоже хочу сделать глубокую копию объекта класса 2. Также будет сделана глубокая копия объекта class1 в class2. но чтобы сохранить память, я хочу этого избежать. Как мне это сделать?

class class1:
    def __init__(self):
        self.largeData = None
        self.mutableVar = None
        self.immutableVar = None


class class2:
    def __init__(self, objc1: class1):
        self.objc1 = objc1  # of the type class1
        self.mutableVar = None
        self.immutableVar = None


c1_1 = class1()
c1_2 = class1()

c2_1 = class2(c1_1)

c2_1Copy = copy.deepcopy(c2_1)
# i want c2_1Copy to reference the same objc1 as c2_1,
# but different mutablevar and immutablevar

c2_2 = class2(c1_2)  # Note: cannot use static variable

, пожалуйста, помогите мне с этим ...
Заранее спасибо

1 Ответ

2 голосов
/ 06 июня 2019

Используйте метод захвата __deepcopy__, чтобы настроить глубокое копирование объектов.

import copy


class LargeDataContainer:
    def __init__(self):
        self.data = "x" * 800


class Thing:
    def __init__(self, large_data: LargeDataContainer):
        self.large_data = large_data
        self.x = [1, 2, 3]

    def __deepcopy__(self, memo):
        new_inst = type(self).__new__(self.__class__)  # skips calling __init__
        new_inst.large_data = self.large_data  # just assign

        # rinse and repeat this for other attrs that need to be deepcopied:
        new_inst.x = copy.deepcopy(self.x, memo)
        return new_inst


ldc = LargeDataContainer()

t1 = Thing(ldc)
t2 = copy.deepcopy(t1)
assert t1 is not t2
assert t1.large_data is t2.large_data
assert t1.x is not t2.x

...