【发布时间】:2019-09-03 01:40:57
【问题描述】:
我正在使用类构建一个简单的纸牌游戏,但遇到了一些令人困惑的事情。
首先是我的“Deck”类的相关方法。
class Deck(object):
def __init__(self, starting_cards=[]):
self._cards = starting_cards
def get_amount(self):
return len(self._cards)
def add_card(self, card):
self._cards.append(card)
这是我的“玩家”课程的一部分:
class Player(object):
def __init__(self, name):
self._name = name
self._hand = Deck()
self._coders = Deck()
def get_hand(self):
return self._hand
def get_coders(self):
return self._coders
def has_won(self):
if self._coders.get_amount() >= 4:
return True
else:
return False
有一些“卡片”子类,但它们与这个问题无关,下面的代码应该向 self._hand 添加 3 张卡片,但它会将卡片添加到 self._hand 和 self._coders,它们是Deck() 类的两个完全不同的实例。
player = Player("Lochie Deakin-Sharpe")
player.get_hand().add_card(NumberCard(3))
player.get_hand().add_card(KeyboardKidnapperCard())
player.get_hand().add_card(AllNighterCard())
player.get_hand()
我的代码的哪一部分将这些卡片添加到 self._coders,据我所知没有调用?
运行上面的代码后,这里有一些命令:
>>> player.get_coders()
Deck(NumberCard(3), KeyboardKidnapperCard(), AllNighterCard())
>>> player.get_hand().add_card(4)
>>> player.get_hand()
Deck(NumberCard(3), KeyboardKidnapperCard(), AllNighterCard(), 4)
>>> player.get_coders()
Deck(NumberCard(3), KeyboardKidnapperCard(), AllNighterCard(), 4)
【问题讨论】:
-
有趣的阅读,我似乎无法链接到我的问题,因为我没有在我的任何代码中调用 self._coders 实例。
-
它准确地回答了您的问题 - 您的所有
Deck实例都使用相同的列表对象。但是看看你当前的设置,为什么要让它成为一个 arg 呢?只需在类构造函数中创建一个空列表即可。 -
您的所有
Deck对象都有默认的list对象。他们都使用同一个列表
标签: python python-3.x class oop