essentiellement, je veux pouvoir faire quelque chose comme: et d'impression bien sûr le numéro deux en conséquence. Quelles méthodes dois-je créer pour obtenir ce comportement dans ma classe entière? P> Disclaimer: Je ne prévois pas d'utiliser ceci pour "réel", juste curieux. P> p>
7 Réponses :
Ceci est un exemple simple et incomplet. Regardez les méthodes __ sous __ code>, __ div __ code> et ainsi de suite. n = Integer()
print n
m = Integer(7)
m+=5
print m
Cet exemple utilise mal-utilise __ RECR __ code>. Qui est destiné à renvoyer l'inverse de eval () code> et doit renvoyer entier (val) code> dans ce cas. Il ne maintient pas non plus le type: python2> m = entier (7) python2> type (m)
Vous devriez être hériter de numéros.number code>, pas objet code>; Selon la réponse NCoghlan ci-dessous. Si vous souhaitez supprimer des méthodes héritées non désirées, c'est facile.
Vous pouvez utiliser surcharge de l'opérateur :
class Integer:
def __init__(self, value):
self.value = value
def __repr__(self):
return str(self.value)
def __add__(self, value):
self.value += value
return self
a = Integer(2)
print a
a = a+3
print a
a += 4
print a
Je suppose que vous voulez que votre classe entière soit mutable. Pour obtenir votre exemple, cela fonctionnera:
class Integer(object):
def __init__(self, num):
self._val = num
def __iadd__(self, other):
self._val += int(other)
def __str__(self):
return str(self._val)
Premièrement, examinez rapidement la documentation du manuel de référence sur Émulation de types numériques . p>
(Ne soyez pas trop collé dessus - il s'agit simplement de vous familiariser avec les méthodes sous-jacentes à des opérations arithmétiques en python) p>
Reportez-vous ensuite à la documentation du numéros code> module , qui Inclut toutes les classes de base abstraites les plus pertinentes pour imiter différents types de nombres (par exemple, numéros.integal code> pour les entiers personnalisés). P>
Si vous souhaitez surcharger des opérateurs de la méthode de chaîne de chaîne par défaut, la phrase que vous recherchez est "Méthodes magiques". Ce sont les méthodes nommées comme " Sa mérite de mentionner que la méthode Pour une liste plus complète de méthodes magiques pour un type numérique, voir Émulation de types numériques . P> __ __ ajouter __ code> et __ str __ code> Méthodes de votre classe afin de travailler respectivement pour les lignes 2 et 3, au travail. P>
__ ajouter __ code> sera appelée si votre nouveau type est l'opérande gauche, et tout type peut être transmis comme argument. Pour les cas lorsque le vôtre est le bon opérande, vous devez également définir la méthode __ radd __ code>. Cela va pour tous les opérateurs binaires. P>
class Integer(object):
def __init__(self, value=0):
self._value = int(value)
def __add__(self, other):
if isinstance(other, Integer):
return Integer(self._value + other._value)
return Integer(self._value + other)
def __iadd__(self, other):
if isinstance(other, Integer):
self._value += other._value
else:
self._value += other
return self
def __sub__(self, other):
if isinstance(other, Integer):
return Integer(self._value - other._value)
return Integer(self._value - other)
def __isub__(self, other):
if isinstance(other, Integer):
self._value -= other._value
else:
self._value -= other
return self
def __mul__(self, other):
if isinstance(other, Integer):
return Integer(self._value * other._value)
return Integer(self._value * other)
def __div__(self, other):
if isinstance(other, Integer):
return Integer(self._value / other._value)
return Integer(self._value / other)
def __str__(self):
return str(self._value)
def __int__(self):
return self._value
def __float__(self):
return float(self._value)
def __repr__(self):
return 'Integer(%s)' % self._value
Essayez ceci:
class Integer(int):
def __init__(self, value):
self.value = value
# Add extra stuff here.
Voir aussi Stackoverflow.com/questions/1638229 .
Veuillez lire ceci: docs.python.org/library/numbers.html#module- numéros . Après avoir lu cela, veuillez Mettre à jour B> Votre question sera plus spécifique.