![](/img/trans.png)
[英]How to apply __add__ method to an infinite count of class instances?
[英]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
並創建一個具有雙倍數量Cards
的DoubleDeck
子類:
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.