Question

Donne l'exemple suivant:

class Foo(object):
    def __init__(self, value=0):
        self.value=value

    def __int__(self):
        return self.value

Je souhaite une classe Foo , qui agit comme un entier (ou un float). Donc, je veux faire les choses suivantes:

f=Foo(3)
print int(f)+5 # is working
print f+5 # TypeError: unsupported operand type(s) for +: 'Foo' and 'int'

La première instruction print int (f) +5 fonctionne, car il existe deux entiers. Le second échoue, car je dois implémenter __ add __ pour effectuer cette opération avec ma classe.

Donc, pour implémenter le comportement entier, je dois implémenter toutes les méthodes d’émulation d’entiers. Comment pourrais-je contourner ça. J'ai essayé d'hériter de int , mais cette tentative a échoué.

Mettre à jour

L'héritage de int échoue si vous souhaitez utiliser un __ init __ :

class Foo(int):
    def __init__(self, some_argument=None, value=0):
        self.value=value
        # do some stuff

    def __int__(self):
        return int(self.value)

Si vous appelez ensuite:

f=Foo(some_argument=3)

vous obtenez:

TypeError: 'some_argument' is an invalid keyword argument for this function

Testé avec Python 2.5 et 2.6

Était-ce utile?

La solution

Vous devez remplacer __ new __ , et non __ init __ :

class Foo(int):
    def __new__(cls, some_argument=None, value=0):
        i = int.__new__(cls, value)
        i._some_argument = some_argument
        return i

    def print_some_argument(self):
        print self._some_argument

Maintenant, votre classe fonctionne comme prévu:

>>> f = Foo(some_argument="I am a customized int", value=10)
>>> f
10
>>> f + 8
18
>>> f * 0.25
2.5
>>> f.print_some_argument()
I am a customized int

Vous trouverez plus d'informations sur le remplacement du nouveau dans Unification des types et des classes dans Python 2.2 .

Autres conseils

En Python 2.4+, héritant de int works:

class MyInt(int):pass
f=MyInt(3)
assert f + 5 == 8

Essayez d’utiliser une version à jour de Python. Votre code fonctionne en 2.6.1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top