Типы ядра Python неизменны, как указывали другие пользователи:
>>> int.frobnicate = lambda self: whatever()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'int'
Вы, конечно, могли бы достичь эффекта, который вы описали, создав подкласс, поскольку пользовательские типы в Python являются изменяемыми по умолчанию.
>>> class MyInt(int):
... def frobnicate(self):
... print 'frobnicating %r' % self
...
>>> five = MyInt(5)
>>> five.frobnicate()
frobnicating 5
>>> five + 8
13
Нет необходимости делать общедоступным подкласс MyInt
; с таким же успехом можно определить его встроенный непосредственно в функции или методе, который создает экземпляр.
Конечно, есть несколько ситуаций, когда программисты на Python, свободно владеющие идиомой, считают, что подобный подклассы - правильное решение. Например, os.stat()
возвращает подкласс tuple
, который добавляет именованные элементы именно для того, чтобы решить проблему читабельности, на которую вы ссылаетесь в своем примере.
>>> import os
>>> st = os.stat('.')
>>> st
(16877, 34996226, 65024L, 69, 1000, 1000, 4096, 1223697425, 1223699268, 1223699268)
>>> st[6]
4096
>>> st.st_size
4096
Тем не менее, в конкретном примере, который вы приводите, я не верю, что подкласс float
в item.price
(или где-либо еще) с большой вероятностью будет считаться делом Pythonic. Я могу легко представить, что кто-то решит добавить метод price_should_equal()
к item
, если это был основной вариант использования; если кто-то ищет что-то более общее, возможно, имеет смысл использовать именованные аргументы, чтобы прояснить предполагаемое значение, как в
should_equal(observed=item.price, expected=19.99)
или что-то в этом роде. Это немного многословно, но, без сомнения, его можно улучшить. Возможное преимущество такого подхода перед патчированием обезьян в стиле Ruby заключается в том, что should_equal()
может легко выполнить сравнение для любого типа, а не только для int
или float
. Но, возможно, я слишком увлечен деталями конкретного примера, который вы предоставили.