Je ne pense pas, mais je pensais demander au cas où. Par exemple, pour une utilisation dans une classe qui encapsule un int: et je ne suis pas simplement intéressé par cet exemple, je cherchais quelque chose de propre et général, ne remplace pas tous les intors et Méthode de chaîne. P> Merci, Sunqiang. C'est juste ce que je voulais. Je n'ai pas réalisé que vous pouvez sous-classer ces types immuables (provenant de C ++). p>
5 Réponses :
Ce dont vous avez besoin?
Pas vraiment. Je cherchais quelque chose comme l'opérateur de conversion C ++, qui remplace intelligemment l'objet du conteneur avec tout ce qu'il contient dans les expressions.
Cela échouera pour "5 + i", je crois.
Ars, vous avez raison, j'ai vu votre réponse et il me manque radd b> ... Je suppose que ça va bien après avoir changé ma réponse ...
Cela devrait faire ce dont vous avez besoin: sortie: p> Pour plus d'informations Recherchez "Radd" dans les documents suivants : p> Vous trouverez d'autres méthodes de ce type pour "addition correcte", "soustraction droite", etc. p> Voici un autre lien qui recouvre les mêmes opérateurs: P> Au fait, Python a des opérateurs de coulée: P> Mais, ils n'abandonneront pas ce dont vous avez besoin dans votre exemple (fondamentalement, parce que les méthodes n'ont aucune annotation de type pour les paramètres, il n'ya donc aucun moyen de lancer implicitement). Donc, vous pouvez le faire: p> mais cela échouera: p>
Vous n'obtiendrez pas les opérateurs de conversion comme en C ++ car Python n'a pas ce genre de système de type statique fort. Les seuls opérateurs de conversion automatique sont ceux qui gérent les valeurs numériques par défaut (int / float); Ils sont prédéfinis dans la langue et ne peuvent pas être changés. P>
type "conversion" est généralement effectué par des constructeurs / usines. Vous pouvez ensuite surcharger des méthodes standard telles que __ ajouter __ code> pour le faire fonctionner plus comme d'autres classes. P>
Parfois peut-être que la sous-classe d'int directement est suffisante. Ensuite, __ ajouter __ code> et
__ radd __ code> ne doit pas ne pas se recourir.
class IntContainer(int):
pass
i = IntContainer(3)
print i + 5 # 8
print 4 + i # 7
class StrContainer(str):
pass
s = StrContainer(3)
print s + '5' # 35
print '4' + s # 43
Désolé d'être venu à la fête de 8,5 ans de retard.
Vous pouvez dériver d'une immuable (c.-à-d. Int). Vous ne pouvez pas définir MAINTENANT, pour répondre à votre question sur les opérateurs de conversion. Vous pouvez également définir __ init __ code> car l'immuable est déjà créée et ne peut pas être modifiée (par définition). C'est là que
__ nouveau __ code> est utile.
__ int __ code>,
__ long __ code>,
__ float __ code>, et évidemment,
__ str __ code>. Pour convertir ou lancer en un objet arbitraire, vous devrez probablement modifier l'autre objet pour obtenir ce que vous voulez. Vous pouvez utiliser la méthode
__ nouvelle __ code> de cet autre objet. Ou si l'autre objet est déjà créé, essayez d'utiliser
__ appel __ code>. P> p>