我已经看到过这个问题的多个实例,但由于我没有默认参数,因此无法确定我做错了什么。
What am I doing wrong? Python object instantiation keeping data from previous instantiation?
#Table.py
class Table:
def __init__(self, players):
self.deck = Deck()
这是Main
t = Table(2)
print len(t.deck.cards)
t = Table(2)
print len(t.deck.cards)
我希望每次打印48次,而是打印
48 and then 96
这是为什么?不应该每次都覆盖这个成员变量吗?
#Deck.py
from Card import *
import random
class Deck:
suits = ['H','C','D','S']
numbers = [2,3,4,5,6,7,8,9,10,11,12,13,14]
cards = []
def __init__(self):
for num in self.numbers:
for suit in self.suits:
c = Card(num,suit)
self.cards.append(c);
random.shuffle(self.cards)
Card.py
class Card:
def __init__(self, num, suit):
self.num = num
self.suit = suit
def __repr__(self):
return str(self.num) + str(self.suit)
def __str__(self):
return str(self.num) + str(self.suit)
答案 0 :(得分:3)
在构造函数中初始化cards
,如下所示:
def __init__(self):
self.cards = []
for num in self.numbers:
for suit in self.suits:
c = Card(num,suit)
self.cards.append(c);
random.shuffle(self.cards)
这样,每次创建一个新的类实例时,cards
都会被初始化。
您的方法无法按预期工作,因为cards
是类数据成员,在<{1}}的所有实例中共享。
答案 1 :(得分:2)
西装,数字和卡片是类变量。因此,在执行self.cards.append(c)
时,您将添加一个类变量,该变量由所有Deck实例的所有实例共享。
将它们改为__init__
:
def __init__(self):
self.cards = []
for num in self.numbers:
for suit in self.suits:
c = Card(num,suit)
self.cards.append(c);
random.shuffle(self.cards)
答案 2 :(得分:-1)
您正在使用类变量而不是实例变量。例如,请参阅python class variables
因此,即使您实例化一个新实例,也不会获得静态类变量的新实例。
西装,数字,卡片。如果你想要实例变量,请使用“self。”,并在init函数中执行。
每次实例化时都会附加卡片,但是要将它们附加到类变量中。因此你最终得到了两倍。