9
votes

Créer mon propre objet "entier" dans Python

essentiellement, je veux pouvoir faire quelque chose comme: xxx

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?

Disclaimer: Je ne prévois pas d'utiliser ceci pour "réel", juste curieux.


2 commentaires

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 Votre question sera plus spécifique.


7 Réponses :


14
votes

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


2 commentaires

Cet exemple utilise mal-utilise __ RECR __ . Qui est destiné à renvoyer l'inverse de eval () et doit renvoyer entier (val) dans ce cas. Il ne maintient pas non plus le type: python2> m = entier (7) python2> type (m) python2> m + = 5 python2> type (m)


Vous devriez être hériter de numéros.number , pas objet ; Selon la réponse NCoghlan ci-dessous. Si vous souhaitez supprimer des méthodes héritées non désirées, c'est facile.



3
votes

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


0 commentaires

3
votes

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)


0 commentaires

7
votes

Premièrement, examinez rapidement la documentation du manuel de référence sur Émulation de types numériques .

(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)

Reportez-vous ensuite à la documentation du numéros module , qui Inclut toutes les classes de base abstraites les plus pertinentes pour imiter différents types de nombres (par exemple, numéros.integal pour les entiers personnalisés).


0 commentaires

3
votes

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 " __ __ " et sont utilisés par Python dans des cas autres que les appels de méthode directe. Vous voudriez définir le __ ajouter __ et __ str __ Méthodes de votre classe afin de travailler respectivement pour les lignes 2 et 3, au travail.

Sa mérite de mentionner que la méthode __ ajouter __ 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 __ . Cela va pour tous les opérateurs binaires.

Pour une liste plus complète de méthodes magiques pour un type numérique, voir Émulation de types numériques .


0 commentaires

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

0 commentaires

0
votes

Essayez ceci:

class Integer(int):
    def __init__(self, value):
        self.value = value
    # Add extra stuff here.


0 commentaires