web-dev-qa-db-fra.com

Comment convertir un objet de classe personnalisé en un tuple en Python?

Si nous définissons la méthode __str__ Dans une classe:

class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y


    def __str__(self, key):
        return '{},{}'.format(self.x, self.y)

Nous pouvons donc convertir son objet en str immédiatement:

a = Point(1, 1)
b = str(a)
print(b)

Mais pour autant que je sache, il n'y a pas une telle méthode magique __Tuple__, Donc je ne sais pas comment définir une classe qui peut passer à Tuple() pour que nous puissions convertir son objet en Tuple immédiatement.

19
acgtyrant

La Tuple "fonction" (c'est vraiment un type, mais cela signifie que vous pouvez l'appeler comme une fonction) prendra tout itérable, y compris un itérateur, comme argument. Donc, si vous souhaitez convertir votre objet en tuple, assurez-vous qu'il est itérable. Cela signifie implémenter un __iter__, qui doit être une fonction de générateur (une dont le corps contient une ou plusieurs expressions yield). par exemple.

>>> class SquaresTo:
...     def __init__(self, n):
...         self.n = n
...     def __iter__(self):
...         for i in range(self.n):
...             yield i * i
...
>>> s = SquaresTo(5)
>>> Tuple(s)
(0, 1, 4, 9, 16)
>>> list(s)
[0, 1, 4, 9, 16]
>>> sum(s)
30

Vous pouvez voir dans l'exemple que plusieurs fonctions/types Python prendront un itérable comme argument et utiliseront la séquence de valeurs qu'il génère pour produire un résultat.

25
holdenweb