Есть ли способ указать функцию / оператор на себя? - PullRequest
1 голос
/ 27 октября 2019

Это на самом деле не проблема, скорее просто из чистого любопытства. Я новичок в Python и видел, что по сравнению с C ++ или Java этот язык действительно прост и имеет множество ярлыков.

Так есть ли способ указать что-то себе? Позвольте мне уточнить. Например, следующая строка:

line = line.lower()

Есть ли способ не иметь часть "line ="? Есть ли способ заставить функцию / оператор изменить себя и установить для него новое значение? Мое вдохновение приходит от текста автозаполнения в pycharm, в котором написано:

line.lower(self)

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

1 Ответ

1 голос
/ 27 октября 2019

Операции на месте возможны только для изменяемых объектов, таких как list. В Python, как и в Java, строки являются неизменным типом. Операция line.lower() создает совершенно новый и отдельный строковый объект. Без части something = ... вы потеряете ссылку на этот новый объект, и line с радостью будет продолжать привязываться к исходной строке в верхнем регистре. Если вы переназначаете конкретно значение line, а не какое-либо другое имя, вы будете привязывать это имя к новому объекту в нижнем регистре. В CPython это означает, что вы уменьшите счетчик ссылок исходной строки и, возможно, соберите мусор.

При этом ничто не мешает вам написать класс, который ведет себя так, как вы хотите. Это можно сделать изменяемым, поддерживая внутреннюю ссылку на строку. Реализуя правильные методы обработки, вы можете смоделировать весь интерфейс str. Вот частичный пример с игрушкой, с которого можно начать:

class MyStr:
    def __init__(self, s):
        self.s = s

    def __add__(self, s):
        return MyStr(self.s + str(s))

    def __iadd__(self, s):
        self.s += str(s)
        return self

    def __str__(self):
        return self.s

    def __repr__(self):
        return '{}({})'.format(type(self).__name__, self.s)

    def lower(self):
        return MyStr(self.s.lower())

    def ilower(self):
        self.s = self.s.lower()

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