2010-02-06 6 views
3

str a d'autres méthodes telles que __rmod__, __rsub__ ou __rmul__Pourquoi str n'a pas de méthode __radd__ en Python?

int ait eu une méthode __radd__

Bizarre, et je voudrais savoir pourquoi.

Exemple radd beeing appelé lors de la première méthode terme A ajouter:

>>> class STR(str): 
...  def __radd__(self, other): 
...    print "jeje" 
...    return other.__add__(self) 
... 
>>> 'aaaaa' + STR('bbbbb') 
jeje 
'aaaaabbbbb' 

Répondre

5

__radd__ est utilisé lorsque le premier terme de l'addition ne met pas en œuvre __add__. Dans le cas de int, l'addition est bien définie par sa définition mathématique, et donc int essaie de contraindre l'autre terme en un nombre.

avec str, il n'y a pas une telle signification bien définie, et les développeurs de python ont décidé qu'il n'y a pas de besoin évident d'avoir quelque chose + "une chaîne".

+0

en êtes-vous sûr? Dans l'exemple ajouté à la question \ _ \ _ radd__ est utilisé et le premier terme a \ _ \ _ add__. –

+0

Dans le cas spécifique de str + STR, STR est une sous-classe de str, puisque cela fournit une méthode plus spécifique, elle est utilisée de préférence à str .__ add__ – SingleNegationElimination

+0

Pourriez-vous m'expliquer un peu plus pour moi s'il vous plait? –

1

Les types définissent uniquement les méthodes qu'ils utilisent. Puisque les seuls objets qui peuvent être ajoutés à des chaînes sont d'autres chaînes ou des objets Unicode, il n'y a pas besoin d'une méthode générale __radd__. __rmul__ vous permet de dupliquer des chaînes:

>>> 4 * 'abc' 
'abcabcabcabc' 

Je ne sais pas pourquoi __rmod__ est nécessaire, mais il est lié en quelque sorte à la mise en forme. Peut-être cela facilite-t-il l'implémentation de la mise en forme avec un seul argument, comme dans "Hello %s" % 'world'. Je ne suis pas sûr. Contrairement à votre affirmation, il n'y a pas de __rsub__ sur les objets str. En résumé, ces méthodes ne sont définies que si elles font réellement quelque chose.