如何正确implement/overload“__repr__”?
How to properly implement/overload "__repr__ "?
python 的新手,这可能是一个愚蠢的问题,但是如何正确实施 repr 方法?
我编写了一个快速的小程序来模拟纸牌游戏,但我不知道为 repr 方法编写什么。 repr Card class 的方法非常简单,但我不知道如何为 DeckOfCards class 这是我的代码:
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()
此外,请随时评论任何您喜欢的内容,无论是设计缺陷还是代码冗余,几乎任何内容。提前致谢!
__repr__
理想情况下可以 return 您将用于创建此实例的对象的表示。
来自repr()
:
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object.
你应该return一个字符串类型,例如在 Deck:
def __repr__(self):
...
return 'Deck : '+str(self._deck)
首先,需要注意的是您没有来实现__repr__
方法。 Python 提供了一个比较合理的默认值(它至少会告诉你类型)。
如果你想实现 __repr__
,"rule of thumb" 是有意义的,你应该提供足够的关于对象的信息,以便用户可以重建它。在你的情况下,从一个套牌到另一个套牌似乎没有任何真正的区别,所以
def __repr__(self):
return 'Deck()'
可能是一个合理的return值。这并不能使状态正确(洗牌后),但是您没有提供用于在特定状态下构建套牌的界面。如果你这样做了,它可能看起来像:
def __repr__(self):
return 'Deck(%s)' % self._deck
python 的新手,这可能是一个愚蠢的问题,但是如何正确实施 repr 方法?
我编写了一个快速的小程序来模拟纸牌游戏,但我不知道为 repr 方法编写什么。 repr Card class 的方法非常简单,但我不知道如何为 DeckOfCards class 这是我的代码:
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()
此外,请随时评论任何您喜欢的内容,无论是设计缺陷还是代码冗余,几乎任何内容。提前致谢!
__repr__
理想情况下可以 return 您将用于创建此实例的对象的表示。
来自repr()
:
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object.
你应该return一个字符串类型,例如在 Deck:
def __repr__(self):
...
return 'Deck : '+str(self._deck)
首先,需要注意的是您没有来实现__repr__
方法。 Python 提供了一个比较合理的默认值(它至少会告诉你类型)。
如果你想实现 __repr__
,"rule of thumb" 是有意义的,你应该提供足够的关于对象的信息,以便用户可以重建它。在你的情况下,从一个套牌到另一个套牌似乎没有任何真正的区别,所以
def __repr__(self):
return 'Deck()'
可能是一个合理的return值。这并不能使状态正确(洗牌后),但是您没有提供用于在特定状态下构建套牌的界面。如果你这样做了,它可能看起来像:
def __repr__(self):
return 'Deck(%s)' % self._deck