J'aimerais pouvoir avoir l'opérateur de ma classe interagir avec des types réguliers de manière à définir. Disons, par exemple, j'ai: Cela fonctionne simplement bien, mais maintenant si j'essaie de faire: p> i get Une erreur depuis un int code> n'a pas de membre nommé
x code>. Comment définir
myNum code> +
int code> dans la classe? Cela ressemble à un travail de décorateurs ou de métaclasses, mais je suis terriblement inconnu avec leur utilisation. Cette question semble similaire, mais pas tout à fait identique. p> p>
3 Réponses :
def __add__(self, other): if isinstance(other, self.__class__): return self.x + other.x elif isinstance(other, int): return self.x + other else: raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))
Merci, je n'ai jamais vu isinstance code> avant. Est-ce que cela considérait la bonne façon de le faire, ou devrais-je utiliser l'essai / à l'exception du bloc proposé par Unutbu?
Le essayez ... sauf la clause code> est rapide quand aucune exception n'est soulevée et lent sinon. Par conséquent, vous pouvez l'utiliser si l'ajout de deux instances de votre classe est l'utilisation la plus courante de l'ajout surchargé. Sinon, l'approche
insinstance code> est bonne.
Ne devriez-vous pas retourner notimplementé code> au lieu de lever et d'exception vous-même?
class Mynum(object): def __init__(self, x): self.x = x def __add__(self, other): try: return self.x + other.x except AttributeError: return self.x + other __radd__=__add__ a = Mynum(1) b = Mynum(2) print(a+b) # 3 print(a+2) # 3 print(2+a) # 3
Pourquoi utiliser la manipulation supplémentaire de commutation et / ou d'exception? L'utilisation de ce qui suit serait une approche plus simple:
Vérifiez le type ou
Autre code> ou présence de
x code> attribut.
N'oubliez pas de faire:
__ radd __ code> =
__ ajouter __ code> également (même si cela ne résout pas votre problème)