Короче говоря, вы не можете. Путь Python - это подкласс String и работа оттуда.
Вы этого не сделаете. Используйте отдельные словари для «присоединения» (логически говоря) информации к неизменяемым значениям, таким как строки или числа (строковое или числовое значение как ключ, информация как соответствующее значение в dict).
Путь Ruby:
"1".to_i
"1".to_roman
Путь Python:
int("1")
Roman("1") # or
Roman.fromstring("1")
Где Роман
будет работать с фиксированным списком встроенных типов или что угодно с методом __ int __
.
Ограничением реализации CPython является то, что вы не можете устанавливать атрибуты встроенных типов / типов расширения. Это сопровождается культурным предпочтением избегать «обезьяньих исправлений» в пользу автономных функций, настраиваемых классов, которые имеют в качестве атрибута желаемый объект (или даже подклассы в редких случаях).
Для этого вы можете создать подкласс str
.
Однако, хотя это технически возможно, большую часть времени вы подклассифицируете встроенные функции (например, str
), вы смотрите на отношения типа «имеет-а», а не «есть-а», поэтому следует использовать композицию, а не наследование (это означает, что вы должны создать класс со строкой в качестве атрибута экземпляра, а не со строкой подкласса).
Вы не можете, это не Pythonic. Monkey-patching не является широко используемой функцией Python, поэтому по причинам производительности - я полагаю - вы не можете делать это на встроенных классах или их экземплярах.
На самом деле, в Python это имеет собственное название: duck-punching.
В CPython вы можете использовать ctypes для доступа к C-API интерпретатора, таким образом вы можете изменять встроенные типы во время выполнения.
import ctypes as c
class PyObject_HEAD(c.Structure):
_fields_ = [
('HEAD', c.c_ubyte * (object.__basicsize__ -
c.sizeof(c.c_void_p))),
('ob_type', c.c_void_p)
]
_get_dict = c.pythonapi._PyObject_GetDictPtr
_get_dict.restype = c.POINTER(c.py_object)
_get_dict.argtypes = [c.py_object]
def get_dict(object):
return _get_dict(object).contents.value
def my_method(self):
print 'tada'
get_dict(str)['my_method'] = my_method
print ''.my_method()
Хотя это интересно посмотреть и может быть довольно интересно разобраться... не никогда не используйте это в продуктивном коде. Просто создайте подкласс встроенного типа или попытайтесь выяснить, есть ли другой, может быть более питонический, подход к решению вашей проблемы.