簡體   English   中英

如何正確實現/重載“__repr__”?

[英]How to properly implement/overload "__repr__ "?

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

此外,您可以隨意評論您想要的任何內容,無論是設計缺陷還是代碼冗余,幾乎任何事情。 提前致謝!

你應該返回一個字符串類型,例如在 Deck 中:

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

__repr__理想情況下可以返回用於創建此實例的對象的表示。

repr()

對於許多類型,此函數會嘗試返回一個字符串,該字符串在傳遞給 eval() 時將產生具有相同值的對象,否則表示是用尖括號括起來的字符串,其中包含對象類型的名稱附加信息通常包括對象的名稱和地址。

首先,應該指出的是,你不必執行__repr__方法。 Python 提供了一個比較合理的默認值(它至少會告訴你類型)。

如果您想實現__repr__ ,“經驗法則”是在有意義的地方,您應該提供有關對象的足夠信息,以便用戶可以重建它。 在你的情況下,從一個甲板到另一個似乎沒有任何真正的區別,所以

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

可能是一個合理的返回值。 這不會使狀態正確(在洗牌后),但是您沒有提供用於在特定狀態下構建牌組的接口。 如果你這樣做了,它可能看起來像:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM