Изменение содержимого экземпляра строки

Есть ли способ изменить содержание экземпляра str в Python?

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

Я не могу просто создать новый метод класса, чтобы он переназначал строку, потому что это класс Widget модуля tkinter.

Мне это нужно, чтобы изменить цвет виджетов. Я знаю, что есть методы, такие как метод config, который сделает это за меня, но когда у меня есть около сотни виджетов, а затем мне нужно изменить цвет всех из них, и каждый цвет отличается, это очень не элегантно, неудобно для напишите строка конфигурации для каждого из этих виджетов, и его очень сложно поддерживать.

Я подумал, что в этом случае было бы здорово использовать указатель, но, к сожалению, в python указателей нет. Я даже подумал о создании какого-то класса, который каким-то образом будет return с содержимым self.string вместо идентификатора экземпляра, такого как <__main__.Spam object at 0x02F20390>.

class String:
...     def __someprivatemethod__(self):
...             return "That returns string on call"
...
>>> spam = String()
>>> spam
<__main__.String object at 0x02F203F0>
>>> # now it should return the "That returns string on call

Однако я не хочу использовать метод __call__ из-за скобок () в конце. В этом примере я просто хочу вернуть строку "That returns string on call". Это вообще возможно?

Я не совсем уверен, что вы пытаетесь сделать, но несколько вещей, которые могут вам понадобиться: (1) использовать @property вместо обычного метода; (2) используйте tkinter.StringVar; (3) использовать список с одним значением в качестве своего рода явного «указателя».

abarnert 02.05.2018 08:44

Кроме того, этот <__main__.Spam object at 0x02F20390> можно изменить, переопределив специальный метод __repr__. Вы также можете отдельно переопределить __str__, чтобы обеспечить различные «читаемые человеком» и «читаемые программистом» представления одного и того же объекта (например, строка "abc" выглядит как abc, когда вы ее print, но 'abc' с кавычками, когда вы просто оцениваете ее в подсказке переводчика).

abarnert 02.05.2018 08:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
29
1

Ответы 1

Нет, вы не можете изменять строковые объекты после их создания. Строканеизменный

Однако, если я правильно вас понимаю, то, что вы хотите, можно сделать с помощью

class StringClass:
    def __someprivatemethod__(self):
        return "That returns string on call"
    def __repr__(self):
        return self.__someprivatemethod__()
    def __str__(self):
        return repr(self)
    def __add__(self, s):
        return '{}{}'.format(repr(self), s)

>>> a = StringClass()
>>> a
That returns string on call
>>> a + 'Strings'
>>>
That returns string on callStrings

Но все же, когда вы набираете a + "Somestring" вместо последней строки, вы получаете TypeError

Jakub Bláha 02.05.2018 08:57

Если это то, что вам нужно, вам нужно реализовать волшебный метод __add__. Я обновил свой ответ

Chen A. 02.05.2018 09:03

Метод __repr__ вызывается только в консоли, а не в реальном коде. Мне нужно в настоящий код, чтобы вернуть str, когда, например, строка строки type(a) выполняется. Мне нужно, чтобы он передал функцию type «Это возвращает некоторую строку».

Jakub Bláha 02.05.2018 09:08
type(a) возвращает совсем другое. Если вы позвоните type('somestring'), вы получите его type, а не значение. __repr__ выводится на консоль, а также при вызове print variable
Chen A. 02.05.2018 09:33

Если вы хотите вернуть строку при вызове type для объекта, вам следует изучить метаклассы. Но я действительно думаю, что то, чего вы пытаетесь достичь, можно сделать проще.

Chen A. 02.05.2018 09:34

Разные действия вызывают разные функции. Если вы можете точно указать, какой ожидаемый результат вы ищете, мы можем попытаться помочь вам выяснить это.

Chen A. 02.05.2018 10:03

Другие вопросы по теме