8
votes

Python: Opérateur surchargeant un type spécifique

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: xxx

Cela fonctionne simplement bien, mais maintenant si j'essaie de faire: xxx

i get Une erreur depuis un int n'a pas de membre nommé x . Comment définir myNum + int 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.


2 commentaires

Vérifiez le type ou Autre ou présence de x attribut.


N'oubliez pas de faire: __ radd __ = __ ajouter __ également (même si cela ne résout pas votre problème)


3 Réponses :


19
votes
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))

3 commentaires

Merci, je n'ai jamais vu isinstance 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 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 est bonne.


Ne devriez-vous pas retourner notimplementé au lieu de lever et d'exception vous-même?



5
votes
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

0 commentaires

2
votes

Pourquoi utiliser la manipulation supplémentaire de commutation et / ou d'exception? L'utilisation de ce qui suit serait une approche plus simple: xxx


0 commentaires