¿Cómo convertir un objeto de clase personalizado a una tupla en Python?

Si definimos el método __str__ en una clase:

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

Entonces podemos convertir su objeto a str inmediatamente:

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

Pero por lo que sé, no existe tal método mágico __tuple__ , por lo que no sé cómo definir una clase que pueda pasar a tuple() para que podamos convertir su objeto en tuple inmediatamente.

La “función” de la tuple (es realmente un tipo, pero eso significa que puede llamarlo como una función) tomará cualquier iterable, incluido un iterador, como argumento. Así que si quieres convertir tu objeto en una tupla, solo asegúrate de que sea iterable. Esto significa implementar un método __iter__ , que debería ser una función generadora (una cuyo cuerpo contenga una o más expresiones de yield ). p.ej

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

Puede ver en el ejemplo que varias funciones / tipos de Python tomarán un iterable como argumento y usarán la secuencia de valores que genera para producir un resultado.