Есть ли способ изменить содержание экземпляра 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"
. Это вообще возможно?
Кроме того, этот <__main__.Spam object at 0x02F20390>
можно изменить, переопределив специальный метод __repr__
. Вы также можете отдельно переопределить __str__
, чтобы обеспечить различные «читаемые человеком» и «читаемые программистом» представления одного и того же объекта (например, строка "abc"
выглядит как abc
, когда вы ее print
, но 'abc'
с кавычками, когда вы просто оцениваете ее в подсказке переводчика).
Нет, вы не можете изменять строковые объекты после их создания. Строканеизменный
Однако, если я правильно вас понимаю, то, что вы хотите, можно сделать с помощью
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
Если это то, что вам нужно, вам нужно реализовать волшебный метод __add__
. Я обновил свой ответ
Метод __repr__
вызывается только в консоли, а не в реальном коде. Мне нужно в настоящий код, чтобы вернуть str
, когда, например, строка строки type(a)
выполняется. Мне нужно, чтобы он передал функцию type
«Это возвращает некоторую строку».
type(a)
возвращает совсем другое. Если вы позвоните type('somestring')
, вы получите его type
, а не значение. __repr__
выводится на консоль, а также при вызове print variable
Если вы хотите вернуть строку при вызове type
для объекта, вам следует изучить метаклассы. Но я действительно думаю, что то, чего вы пытаетесь достичь, можно сделать проще.
Разные действия вызывают разные функции. Если вы можете точно указать, какой ожидаемый результат вы ищете, мы можем попытаться помочь вам выяснить это.
Я не совсем уверен, что вы пытаетесь сделать, но несколько вещей, которые могут вам понадобиться: (1) использовать
@property
вместо обычного метода; (2) используйтеtkinter.StringVar
; (3) использовать список с одним значением в качестве своего рода явного «указателя».