【问题标题】:How to properly implement/overload "__repr__ "?如何正确实现/重载“__repr__”?
【发布时间】:2016-03-31 03:51:21
【问题描述】:

python 新手,这可能是一个愚蠢的问题,但是如何正确实现 repr 方法?

我写了一个快速的小程序来模拟纸牌游戏,但我不知道为 repr 方法写什么。 Card 类repr 方法非常简单,但我不知道如何处理 DeckOfCards 类 这是我的代码:

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

此外,您可以随意评论任何您想要的内容,无论是设计缺陷还是代码冗余,实际上是任何内容。提前致谢!

【问题讨论】:

    标签: python overloading


    【解决方案1】:

    你应该返回一个字符串类型,例如在 Deck 中:

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

    【讨论】:

    • 这就是我手头的方式,但每次将其转换为字符串似乎很浪费。但是,可以。
    • 标记已回答的问题,这样人们就不会继续发布答案。 :)
    • 时间有限,回答太快了。但是会的,谢谢!
    【解决方案2】:

    __repr__ 理想情况下可以返回用于创建此实例的对象的表示形式。

    来自repr()

    对于许多类型,此函数会尝试返回一个字符串,该字符串在传递给 eval() 时会产生具有相同值的对象,否则表示是一个包含在尖括号中的字符串,其中包含类型的名称对象连同其他信息,通常包括对象的名称和地址。

    【讨论】:

      【解决方案3】:

      首先,应该注意您没有 来实现__repr__ 方法。 Python 提供了一个合理的默认值(它至少会告诉你类型)。

      如果你想实现__repr__,“经验法则”是在有意义的地方,你应该提供足够的关于对象的信息,以便用户可以重建它。在你的情况下,从一个甲板到另一个甲板似乎没有任何真正的区别,所以

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

      可能是一个合理的返回值。这不会使状态正确(在洗牌之后),但是您没有提供用于在特定状态下构建套牌的界面。如果你这样做了,它可能看起来像:

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

      【讨论】:

      • 我知道默认方法,但我需要以特定方式对其进行格式化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2013-07-22
      相关资源
      最近更新 更多