python copy, копирование классов

Когда выполняю код:

import copy


class LeafParameters:
    FLOW_TYPE = 'flow type: '

temp = copy.deepcopy(LeafParameters)
temp.FLOW_TYPE = '123'


print(LeafParameters.FLOW_TYPE)
print(temp.FLOW_TYPE)

имею следующий вывод:

123
123

А хотелось бы что бы оригинал LeafParameters продолжал иметь FLOW_TYPE = 'flow type: '


Ответы (2 шт):

Автор решения: Oopss

Может я чего-то не понял, но зачем копировать?

class LeafParameters:
    FLOW_TYPE = 'flow type: '

temp = LeafParameters()
temp1= LeafParameters()
temp.FLOW_TYPE = '123'

print(temp1.FLOW_TYPE)
print(LeafParameters.FLOW_TYPE)
print(temp.FLOW_TYPE)

flow type: 
flow type: 
123
→ Ссылка
Автор решения: insolor

При попытке копировать класс с помощью deepcopy или просто copy возвращается сам же класс:

import copy


class LeafParameters:
    FLOW_TYPE = 'flow type: '


temp = copy.deepcopy(LeafParameters)

print(id(LeafParameters))
print(id(temp))
print(temp is LeafParameters)

Пример вывода:

94618641916496
94618641916496
True

id (адрес) один и тот же, значит объект (класс - тоже объект) один и тот же. Результат True сравнения через is также показывает, что это один и тот же объект.

Соответствующий кусок документации:

This module does not copy types like module, method, stack trace, stack frame, file, socket, window, or any similar types. It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged; this is compatible with the way these are treated by the pickle module.

Т.е. буквально, при попытке копировать (поверхностно или глубоко) функцию или класс будет возвращен исходный объект без изменений.

Если создавать объекты класса и копировать их, все будет работать как и ожидалось:

import copy


class LeafParameters:
    FLOW_TYPE = 'flow type: '


ob = LeafParameters()
temp = copy.deepcopy(ob)

temp.FLOW_TYPE = '123'

print(ob.FLOW_TYPE)
print(LeafParameters.FLOW_TYPE)
print(temp.FLOW_TYPE)

Вывод:

flow type: 
flow type: 
123
→ Ссылка