2017-09-03 10 views
1

私はこの質問の複数のインスタンスをこのように見てきましたが、デフォルトの引数を持たないので、私が間違っていることを正確に特定できません。前のデータを保持するPythonオブジェクト?

What am I doing wrong? Python object instantiation keeping data from previous instantiation?

#Table.py 
class Table: 

def __init__(self, players): 
    self.deck = Deck() 

そして、これは主

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) 
+4

投稿してくださいコードをDeck.py – Penn

+0

ために私はあなたがDeck' 'で' cards'と呼ばれるクラス変数を持っていると思いますか? – PRMoureu

+0

@Pennありがとう:) – k9b

答えて

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は、クラスのデータメンバであるため、

あなたのアプローチは、動作しませんでした、はクラスDeckのすべてのインスタンス間でを共有しました。

+0

よく@Penn今度は同じ順序でカードがシャッフルされる別の問題があるようです:)これで今作業していますhttps://stackoverflow.com/questions/4794663/python-list-does-not-shuffle -in-a-loop – k9b

-1

あなたはクラス変数の代わりに、インスタンス変数を使用しています。たとえば、python class variables

を参照してください。したがって、新しいインスタンスをインスタンス化しても、静的クラス変数の新しいインスタンスは取得されません。

スーツ、ナンバー、カード。インスタンス変数が必要な場合は、 "self"を使用し、init関数で行います。

インスタンス化するたびにカードを追加しますが、それらをクラス変数に追加しています。したがって、あなたは2倍の数で終わります。このようなコンストラクタで

+0

ねえ、物事をより良くしたり、コードサンプルを与えたりして、私はそれを得る。しかし、誰でも私を落胆させてくれました。あなたは何が間違っているのかを教えて、次回はうまくいくでしょう。私の答えは正しいと思う - 何が分からないの?ありがとう。 – Basya

+0

私はdownvoteをしませんでしたが、コードサンプルは素晴らしいでしょう! – Penn

+0

はい、そうでしょう。しかし誰かがそれに私を打つので、私はそれを繰り返すとは思わない - それは多かれ少なかれ同じだろう。まだdownvoteについて興味があります....私は答えを得て、それから学ぶか、私は疑問に思うままになるでしょう:-)私は「ポスト」をあまりにも早く打ち、すぐにそれを編集したためかもしれませんが、私の初期の断片は間違っていないと思います。十分な説明。 – Basya

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) 
関連する問題