2016-03-31 8 views
1

これは愚かな質問かもしれませんが、のreprメソッドを正しく実装するにはどうすればいいですか?「__repr__」を正しく実装/オーバーロードする方法は?

私はカードのゲームをシミュレートするための素早いプログラムを書いたが、reprメソッドのために何を書くべきか分からない。 カードのクラスための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() 

何にコメントすること自由に感じ、設計上の欠陥であろうと、コード内の冗長性であろうと、文字通り何でも好きです。前もって感謝します!

答えて

1

あなたはデッキで、たとえば、文字列型を返す必要があります:

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

これは私が手でそれを手にした方法ですが、たびたび毎回文字列に変換するのは無駄だったようです。しかし、はい、そうするでしょう。 –

+0

人々が回答を投稿し続けることがないように、質問に回答します。 :) – libby

+0

時間制限は、あまりにも速いと答えました。しかし、ありがとう! –

0

__repr__は、理想的には、このインスタンスの作成に使用するオブジェクトの表現を返すことができます。

repr()から:

多くのタイプの場合、この関数は、eval()関数に渡されたときに同じ値を持つオブジェクトをもたらすであろう文字列を返すための試みを行い、それ以外の表現は、で囲まれた文字列ですオブジェクトの名前とアドレスを含むことが多い追加情報と共に、オブジェクトのタイプの名前が含まれています。

0

はまず、あなたが__repr__メソッドを実装するを持っていないことに留意すべきです。 Pythonはやや妥当なデフォルトを提供しています(少なくとも型を教えてくれるでしょう)。

__repr__を実装する場合、「経験則」は、ユーザーがそれを再構築できる十分な情報を提供する必要があるということです。あなたのケースでは、その

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

かもしれない、別のデッキから任意の実際の差は合理的な戻り値があるようには思えません。これは、(シャフリング後の)状態の権利を取得しませんが、特定の状態のデッキを構築するためのインタフェースを提供しません。もしそうなら、それは次のようになるかもしれません:

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

私はデフォルトの方法を知っていますが、私はそれを特定の方法でフォーマットする必要がありました。 –

関連する問題