Python对象保存以前的数据?

时间:2017-09-03 18:29:54

标签: python class oop initialization

我已经看到过这个问题的多个实例,但由于我没有默认参数,因此无法确定我做错了什么。

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)

3 个答案:

答案 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函数中执行。

每次实例化时都会附加卡片,但是要将它们附加到类变量中。因此你最终得到了两倍。