簡體   English   中英

Python:如何使用 __add__ 特殊方法添加返回該 class 的另一個實例的相同 class 的實例

[英]Python: How to use __add__ special method to add instances of the same class that return another instance of that class

為紙牌游戲編寫程序是提出這個問題的原因。 目前,我定義__add__特殊方法的方式實際上可以執行以下操作:

deck_one = Deck()
deck_two = Deck()
decks = deck_one + deck_two  

挑戰在於套decks是一個列表,我很好奇是否有辦法添加deck_one + deck_two牌二這樣套decks也會變成套牌類型?

我嘗試這樣做的一個原因是,如果我想要一個游戲包含多個套牌,那么能夠將它們全部添加在一起並將它們傳遞到可以“容納”一些套牌的套decks中會很整潔.

下面是我的代碼片段。 我可以完全離開這里,但__repr__會在其中扮演任何角色嗎? self.cards是后面的方法中實際引用的內容。 據我了解, __repr__返回它的表示(並且作為sideq;我相信__str__如果未定義會返回相同的內容(盡管如果我錯了請糾正我),但我的理解是,如果我只包括一個,它通常選擇__repr__的更好做法,除非兩者都應包括在內?無論如何:

import collections
import random

Card = collections.namedtuple('Card', ['value', 'suit'])

class Deck:

    values = [str(v) for v in range(2, 11)] + list('JQKA')
    suits = "Spades Diamonds Hearts Clubs".split()

    def __init__(self):
        self.cards = [Card(value, suit) for suit in self.suits for value in self.values]

    def __repr__(self):
        deck_cards = "Deck()\n"
        for card in self.cards:
            deck_cards += f"({card.value}-{card.suit})"
        return deck_cards

    def __len__(self):
        return len(self.cards)

    def __getitem__(self, position):
        return self.cards[position]

    def __add__(self, deck):
        return self.cards + deck.cards  

    def shuffle(self):
        random.shuffle(self.cards)

    def draw_card(self):
        return self.cards.pop()

正確的方法可能是繼承Deck並創建一個具有雙倍數量CardsDoubleDeck子類:

class DoubleDeck(Deck):

    values = Deck.values * 2


len(DoubleDeck())    # --> 104

在這種情況下,實現加法運算符有點做作,但是如果您創建一個新的Deck並將每個操作數的兩個Cards列表連接到它並返回它,則可以工作:(這不是我最喜歡的解決方法問題)

    def __add__(self, other):
        assert isinstance(other, type(self)
        larger_deck = self.__class__()
        larger_deck.cards = self.cards[:] + other.cards[:]  # making a proper copy of the objects
        return larger_deck

暫無
暫無

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

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