Python types de base sont immuables, de par sa conception, comme d'autres utilisateurs l'ont souligné:
>>> 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'
Vous avez certainement pu obtenir l'effet que vous décrivez en faisant une sous-classe, puisque les types définis par l'utilisateur en Python sont mutables par défaut.
>>> class MyInt(int):
... def frobnicate(self):
... print 'frobnicating %r' % self
...
>>> five = MyInt(5)
>>> five.frobnicate()
frobnicating 5
>>> five + 8
13
Il n'y a pas besoin de faire de l' MyInt
sous-classe publique, soit; on pourrait tout aussi bien définir inline directement dans la fonction ou de la méthode que des constructions de l'instance.
Certainement, il y a peu de situations où Python pour les programmeurs qui sont à l'aise dans l'idiome d'envisager ce type de sous-classement, la bonne chose à faire. Par exemple, os.stat()
renvoie un tuple
sous-classe qui ajoute les membres nommés, afin précisément d'aborder le genre de la lisibilité de l'inquiétude vous vous référez dans votre exemple.
>>> import os
>>> st = os.stat('.')
>>> st
(16877, 34996226, 65024L, 69, 1000, 1000, 4096, 1223697425, 1223699268, 1223699268)
>>> st[6]
4096
>>> st.st_size
4096
Cela dit, dans l'exemple que vous donnez, je ne crois pas que le sous-classement float
en item.price
(ou ailleurs) serait très probablement être considéré comme le Pythonic chose à faire. Je peux facilement imaginer quelqu'un de décider d'ajouter un price_should_equal()
méthode de item
si c'était le cas d'utilisation principal; si l'on était à la recherche de quelque chose de plus général, peut-être qu'il pourrait faire plus de sens d'utiliser des arguments nommés pour rendre le sens plus clair, que dans
should_equal(observed=item.price, expected=19.99)
ou quelque chose le long de ces lignes. C'est un peu verbeux, mais nul doute qu'elle pourrait être améliorée. Un possible avantage d'une telle approche sur Ruby-style singe brassage est qu' should_equal()
pourrait facilement effectuer une comparaison sur n'importe quel type, pas seulement int
ou float
. Mais peut-être que je suis trop pris dans les détails de l'exemple particulier qui vous est arrivé, à fournir.