2

「in」キーワードを私が作成したクラスにどのように拡張できますか?カードクラスでカードゲームを作っています。プレイヤーの手である別のクラスがあります。基本的に、あるカードが手札にあるかどうかを確認したいです。例えは以下のとおりです。

>>> 5 in range(0, 5)
True

これは私のコードです。Handクラスがあり、Card()がHand()にあるかどうかを確認したい

また、私はこのクラスの概念に不慣れです。私はこのすべてがどのように機能するかを理解し始めたばかりです。lenメソッドを正しく実装しましたか?

class Card:
    def __init__(self, suit, rank):
        # self.suit > str
        # self.rank > str
        if (suit in SUITS) and (rank in RANKS):
            self.suit = suit
            self.rank = rank
        else:
            self.suit = None
            self.rank = None
            print "Invalid card:", suit, rank

    def __str__(self):
        return self.suit + self.rank

    def get_suit(self):
        return self.suit

    def get_rank(self):
        return self.rank


# define hand class
class Hand:
    # A list of Card objects
    # adding cards to the hand should remove cards from the deck.

    def __init__(self):
        self.hand = []

    def __str__(self):
        cards = []
        for card in self.hand:
            cards += [card.get_suit() + card.get_rank()]
        return str(cards)

    def add_card(self, card):
        return self.hand.append(card)

    def __len__(self):
        counter = 0
        for card in self.hand:
            counter +=1
        return counter

OK、それで私はこのコードをハンドクラスに追加しました:

    def __contains__(self, card):
        return card in self.hand

しかし、コードをテストしようとしましたが、機能しません。

c = Card('H','A')

h = Hand()
h.add_card(Card('S','K'))
h.add_card(Card('D','A'))
h.add_card(Card('H','A'))

print 'hand=', h
print 'c=', c
print 'c in h', c in h

ターミナルでFalseと表示されます...なぜですか??

4

2 に答える 2

4

__contains__あなたは魔法の方法を探しています。

に関してはlen、実装は正しい結果をもたらしますが、不必要に複雑です。あなたはただすることができます:

def __len__(self):
    return len(self.hand)
于 2012-11-30T07:26:28.570 に答える
1

@BrenBarnは、を見る正しい方向へのポインタを提供しました__contains__。しかし、私が彼の答えについてコメントしたように、そのメソッドを実装するには、おそらくCardオブジェクトが比較可能である必要があります。現在、2枚のカードは両方が同じオブジェクトである場合にのみ等しく表示されます。

私が言っていることの例として、これを試してください:

c1 = Card("H", "A")
c2 = Card("H", "A")

print c1 == c2 # False!

__eq__これを修正するには、クラスにメソッドを追加する必要がありますCard(おそらくメソッドも追加するので、テスト__ne__を使用できるようになります)。!=可能な実装は次のとおりです。

def __eq__(self, other):
    return self.suit == other.suit and self.rank == other rank

def __ne__(self, other):
    return not self == other

私が指摘したいことがもう1つあります(あなたの質問とは関係ありません)。あなたのCardクラスには、スーツとランクの「より良い」メソッドがあります。これらは通常、Pythonでは不要です。Pythonでは、通常、最初にパブリック変数を使用してすべてをプログラムできます。つまり、現在呼び出しているものはすべて、代わりcard.get_suitにアクセスする必要がありますcard.suit

変数アクセスに応じて複雑なことを行う必要があるあまり一般的でない状況(要求されたときに特定の値を計算したり、特定の値が割り当てられないようにしたりするなど)では、Propertyインスタンスをクラスに配置できます(通常はデコレータとして関数)であり、外部コードは、パブリック変数であるかのようにアクセスできます。多くのゲッターを含むコードは、Pythonのように通常の変数とプロパティを切り替えることができない他のプログラミング言語では一般的です。

于 2012-11-30T08:17:14.507 に答える