¿Cómo implementar / sobrecargar correctamente “__repr__”?

Nuevo en Python y esta podría ser una pregunta tonta, pero ¿cómo se implementa correctamente el método de reproducción ?

Escribí un pequeño progtwig rápido para simular un juego de cartas, pero no sé qué escribir para el método de reproducción . El método de reproducción para la clase Card fue bastante sencillo, pero no sé qué hacer para la clase DeckOfCards Aquí está mi código:

import random class Card: '''Create a single card, by id number''' # Class variables, created once for the class suits = [ '\u2660', '\u2661', '\u2662', '\u2663' ] ranks = [ 'A','2','3','4','5','6','7','8','9','10','J','Q','K' ] def __init__(self, n=0): # instance variables for _num, _rank, _suit, _value if 0 <= n < 52: self._num = n self._rank = Card.ranks[n%13] # note referencing class vars self._suit = Card.suits[n//13] self._value = n%13 + 1 if self._rank == 'A': self._value = 14 else: # invalid card indicators self._rank = 'x' self._suit = 'x' self._value = -1 def __repr__(self): return self._rank + self._suit def __lt__(self,other): return self._value < other._value def __le__(self,other): return self._value <= other._value def __eq__(self,other): return self._value == other._value class DeckOfCards: '''A Deck is a collection of cards''' def __init__(self): self._deck = [ Card(i) for i in range(52) ] def __repr__(self): return 'Deck : ', self._deck def shuffle(self): return random.shuffle(self._deck) def deal_a_card(self, i=-1): #that way player can choose where to draw from return self._deck.pop(i) def cards_left(self,count): return len(self._deck) new_deck = DeckOfCards() 

Además, no dude en comentar lo que quiera, ya sea una falla de diseño o redundancia en el código, literalmente cualquier cosa. ¡Gracias por adelantado!

Debes devolver un tipo de cadena, por ejemplo en Deck:

 def __repr__(self): ... return 'Deck : '+str(self._deck) 

__repr__ idealmente podría devolver la representación del objeto que usaría para crear esta instancia.

Desde repr() :

Para muchos tipos, esta función intenta devolver una cadena que produciría un objeto con el mismo valor cuando se pasa a eval (); de lo contrario, la representación es una cadena encerrada entre paréntesis angulares que contiene el nombre del tipo de objeto. con información adicional que a menudo incluye el nombre y la dirección del objeto.

Primero, se debe tener en cuenta que no es necesario implementar el método __repr__ . Python proporciona un valor predeterminado bastante razonable (al menos le dirá el tipo).

Si desea implementar __repr__ , la “regla de oro” es que donde tiene sentido, debe proporcionar suficiente información sobre el objeto que un usuario pueda reconstruir. En su caso, no parece haber ninguna diferencia real de una baraja a otra, por lo que

 def __repr__(self): return 'Deck()' 

podría ser un valor de retorno razonable. Esto no consigue el estado correcto (después de barajar), pero no proporciona una interfaz para construir una plataforma en un estado particular. Si lo hicieras, podría verse como:

 def __repr__(self): return 'Deck(%s)' % self._deck