Даже если бы вы могли добавить собственный метод к строке, вы все равно не смогли бы написать метод мутатора: строки Python являются неизменяемыми.

жный дубликат:
Могу ли я добавить собственные методы / атрибуты во встроенные типы Python?

В Ruby вы можете переопределить любой встроенный класс объектов с помощью пользовательского метода, например так:

class String
  def sayHello
    return self+" is saying hello!"
  end
end                              

puts 'JOHN'.downcase.sayHello   # >>> 'john is saying hello!'

Как я могу сделать это в Python? Есть ли нормальный способ или просто хаки?

 user39576015 янв. 2011 г., 12:09
Monkeypatching возможен, но имеет ограничения, как указано в этом вопросе (и даже больше). Я рекомендую просто определить «бесплатную» функцию, которая делает это.
 TryPyPy15 янв. 2011 г., 11:57
На это только что ответили вstackoverflow.com/questions/4698493/... , Предложить закрытие.

Ответы на вопрос(2)

которая принимает строку в качестве первого аргумента:

def sayhello(name):
    return "{} is saying hello".format(name)

>>> sayhello('JOHN'.lower())
'john is saying hello'

Просто чисто и легко. Не все должно быть вызовом метода.

 Duncan12 февр. 2014 г., 20:11
Даже если бы вы могли добавить собственный метод к строке, вы все равно не смогли бы написать метод мутатора: строки Python являются неизменяемыми.
 Quuxplusone12 февр. 2014 г., 19:58
Недостаток этого подхода в том, что вы не можете написать метод-мутатор. Например, сегодня я хочу методstr.startswithThenRemove(p) что мутируетstr удалить необязательный префиксp а затем возвращаетсяTrue если префикс был найден иFalse если это не так:if option.startswithThenRemove("--foo="): handleFoo(option), Вы не можете сделать это простым способом в Python (но посмотритеstackoverflow.com/a/1551223/1424877).
Решение Вопроса

потому что встроенные типы закодированы в C. Что вы можете сделать, это создать подкласс типа:

class string(str):
    def sayHello(self):
        print(self, "is saying 'hello'")

Контрольная работа:

>>> x = string("test")
>>> x
'test'
>>> x.sayHello()
test is saying 'hello'

Вы также можете переписать str-тип с помощьюclass str(str):, но это не значит, что вы можете использовать буквальное"test"потому что это ссылка на встроенныйstr.

>>> x = "hello"
>>> x.sayHello()
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    x.sayHello()
AttributeError: 'str' object has no attribute 'sayHello'
>>> x = str("hello")
>>> x.sayHello()
hello is saying 'hello'

Ваш ответ на вопрос