__repr__
и __str__
служат различным целям, но работают одинаково.
Вы можете прочитать это , чтобы помочь вам выбрать один из двух методов.
Вы можете изменить метод __str__
класса Hand следующим образом:
class Hand:
def __str__(self):
hand_tostr = ', '.join(map(str, self.cards)) # I use map to apply str() to each element of self.cards
return 'The {} is composed by {}'.format(self.label, hand_tostr)
Если вы хотите изменить метод __repr__
класса Card, вы можете попробовать что-то вродеэто (вы не предоставили код для класса Card)
class Card:
#your code
def __repr__(self):
return <some string>
Теперь, если вы сделаете str(<list of Card objects>)
, он будет использовать метод __repr__
на каждом экземпляре карты для отображения того, что вы хотите.Я не большой поклонник этого решения, для вашего случая я бы использовал первое, так как вы можете сохранить представление карты по умолчанию для других случаев.
Будьте осторожны с этим кодом:
def add_card(self,card):
if isinstance(card, Card): #check if card belongs to card Class!!
self.cards.append(card)
Вы ничего не поднимаете, если карта не является экземпляром карты.Это означает, что если вы используете этот метод с неправильным параметром, ошибка будет скрыта, и вы не будете знать, что колода не изменилась.Это довольно опасно.Вместо этого вы можете сделать что-то вроде этого:
def add_card(self,card):
assert(isinstance(card, Card)), "card parameter of add_card must be an instance of Card class"
self.cards.append(card)
В более питоническом ключе вы можете использовать typehint , чтобы проинформировать пользователя ваших классов о том, что карта должна быть экземпляром карты.Затем доверьтесь стилю Python по типу утки или используйте такие инструменты, как mypy , чтобы убедиться, что метод используется правильно.