Python: сделать копию объекта, когда старый объект будет равен новому - PullRequest
1 голос
/ 20 февраля 2012

Я создал новый класс на основе класса str по умолчанию.Я также изменил методы по умолчанию, такие как __add__, __mul__, __repr__ и т. Д. Но я хочу изменить поведение по умолчанию, когда пользователь приравнивает новую переменную к старой.Посмотрите, что у меня сейчас:

a = stream('new stream')
b = a
b += ' was modified'
a == b
>>> True
print a
>>> stream('new stream was modified')
print b
>>> stream('new stream was modified')

Так что, как вы видите каждый раз, когда я изменяю вторую переменную, Python также меняет исходную переменную.Как я понимаю, Python просто отправляет адрес переменной a в переменную b.Можно ли сделать копию переменной при создании, как в обычном str?Как мне кажется, мне нужно что-то вроде new в C ++.

a = 'new string'
b = a
b += ' was modified'
a == b
>>> False

PS Создание объекта начинается в самом себе. new () метод.Создание сделано так:

def __new__(self, string):
  return(str.__new__(self, string))

Это сложнее, потому что он заботится о Unicode и типе QString, сначала получая от них объект str, но я думаю, что это не обязательно.

1 Ответ

1 голос
/ 21 февраля 2012

Я не верю, что вы можете изменить поведение оператора присваивания, но существуют явные способы создать копию объекта, а не просто использовать ссылку.Для сложного объекта взгляните на модуль копирования .Для базового типа последовательности (например, str) при условии правильной реализации фрагмента работают следующие операции:

Код

a = str('abc')

#A slice creates a copy of a sequence object. 
#[:] creates a copy of the entire thing.
b = a[:]

#Since b is a full copy of a, this will not modify a
b += ' was modified'

#Check the various values
print('a == b' + str(a == b))
print(a)
print(b)

Вывод

False
abc
abc was modified
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...