2011-04-17 105 views
2

嗨 我创建了一个对象列表。每个对象都包含一个Set。我想更新列表中所有对象的集合内容。我写来完成这个过程的代码将元素添加到集合中,将元素添加到包含此集合的对象的所有实例

class Player: 
    name = "" 
    cardsInHand = set() 
    hasBid = False 
    def __init__(self, name): 
     self.name = name 

class CardDeck: 
    deck = [] 

    def __init__(self): 
     for i in range(39) : 
     if i%10>0 and i%10<9 : 
       self.deck.append(i) 

    def dealCards(self,player): 
     cardIndex = 0 
     for tempPlayer in player: 
      for j in range(4): # since want to add four elements at a time 
       tempPlayer.cardsInHand.add(self.deck.pop(cardIndex)) 
       cardIndex = cardIndex +1 

的主要方法,我呼吁上述类别下面的代码

players = [] 
players.append(Player("Player0")) 
players.append(Player("Player1")) 
players.append(Player("Player2")) 
players.append(Player("Player3")) 

cards.dealCards(players) 

的问题是,dealCards方法添加元素,所有的组的物体。而不是每个对象集合中的4个元素,我最终在每个对象的集合中都有相同的16个元素? 我是新来的python,我做错了什么?

回答

3

您正在创建类属性。

class Player: 
    def __init__(self, name): 
     self.name = name 
     self.cardsInHand = set() 
     self.hasBid = False 
+0

这个工作!。猜猜我必须更多地关注课程属性。我认为这与java中类的变量以及构造函数中的变量相同,只需要初始化它们即可。 – nesta13 2011-04-17 14:28:40

+0

纠正我,如果我错了,类属性的东西类似于全局变量? – nesta13 2011-04-17 14:29:20

+0

如果课程是全球性的,那么是的。 – 2011-04-17 14:37:51

3

您已经定义cardsInHand(以及namehasBid)是类变量而不是实例变量;通过在类体中定义它们,您将它们定义为所有实例共享的变量。如果你熟悉Java,它们基本上就像静态变量。为了让他们的实例变量,需要声明他们在__init__方法,像这样:

def __init__(self, name): 
    self.name = name 
    self.hasBid = False 
    self.cardsInHand = set() 
+0

是从早期回复中得到的想法! – nesta13 2011-04-17 14:31:17