Python:如何使用__add__特殊方法添加返回该类的另一个实例的同一类的实例



为纸牌游戏编写程序是这个问题的动机。目前,我定义__add__特殊方法的方式,我实际上可以做这样的事情:

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

挑战在于decks是一个列表,我很好奇是否有办法添加deck_one + deck_two,以便decks也会成为 Deck 类型?

我尝试这样做的一个原因是,如果我希望一个游戏包含多个套牌,那么能够将它们全部添加在一起并将它们传递到decks中,这将"容纳"大约n个套牌。

下面是我的代码片段。我可以完全离开这里,但__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

相关内容

最新更新