питонический способ изменения изменяемого внутри неизменного - PullRequest
1 голос
/ 29 декабря 2010

скажем, у меня есть класс, который ведет себя как int к внешнему миру, но на самом деле это изменчивый объект, который занимает фиксированное место в нескольких структурах. если n - мой объект, я могу обновить его сейчас, написав n.update(34), но я обнаружил, что всегда хочу написать n = 34. Я просмотрел http://docs.python.org/reference/datamodel.html, и не вижу ничего похожего на атрибут __assign__ или __value__, который позволил бы мне перехватить оператор = и позволить мне обновлять мой объект, а не присваивать int переменной n выбросить мой предмет еще лучше, когда изменяемый файл находится внутри кортежа t = (m, n), я хотел бы обновить свой изменяемый файл с помощью t[1] = 34, но Python видит это как попытку изменить неизменяемый объект.

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

1 Ответ

3 голосов
/ 29 декабря 2010

Ваш базовый obj.value = newvalue в основном лучший, самый понятный способ.Как вы предполагаете, в Python невозможно переопределить присваивание.

Вы можете реализовать __call__() в своем классе для выполнения присваивания, чтобы вы могли просто выполнить obj(newvalue).Тем не менее, для обычного читателя не совсем ясно, что это переназначение.

Другой идеей было бы реализовать __ilshift__(), чтобы вы могли сделать obj <<= newval.По крайней мере, это выглядит как какая-то операция по переназначению мутанта, если вы щурились достаточно сильно.Если бы это был не числовой тип, я мог бы рассмотреть это.Но << имеет четко определенное значение с int, и, поскольку вы маскируетесь под этот тип, ИМХО было бы сложно использовать его таким образом.

...