2013-10-05 38 views
1

我有這三個Python類:父運行類方法

class Card(object): 
    RANKS = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"] 
    SUITS = ["c", "d", "h", "s"] 
    def __init__(self, rank, suit): 
     self.rank = rank 
     self.suit = suit 

    def __str__(self): 
     return self.rank + self.suit 

    def __lt__(self, other): 
     return self.value < other.value 

    def __gt__(self, other): 
     return self.value > other.value 

    @property 
    def value(self): 
     return RANKS.index(self.rank) + SUITS.index(self.suit)/4 


class Hand(object): 
    def __init__(self, cards = []): 
     self.cards = cards 
     self.tricks = 0 

    def __str__(self): 
     return " ".join([str(card) for card in self.cards]) 

    def add(self, card): 
     self.cards.append(card) 

    def remove(self, card): 
     self.cards.remove(card) 


class Deck(Hand): 
    def populate(self): 
     for rank in Card.RANKS: 
      for suit in Card.SUITS: 
       self.add(Card(rank, suit)) 

但是當我運行這段代碼:

deck1 = Deck() 
deck1.populate() 
hand1 = Hand() 
print(hand1) 

卡打印的整個甲板。 Hand類似乎正在運行populate(self)。爲什麼?

+3

您在'Hand .__ init __()'中使用可變默認值;卡片本質上是一個全球性的。 –

回答

1

你的問題是在這裏:

def __init__(self, cards = []): 
     self.cards = cards 
     self.tricks = 0 

你看,像def __init__(self, cards=[]): Python的函數定義默認參數僅計算一次,當函數的定義是通過解釋加載,所以他們的行爲有點全球十歲上下。還要注意,該列表是一個可變對象,因此,根據定義,它可以更改它的元素。結果,當您撥打self.cards.append(card)時,它會附加到一次評估,每次都是相同的列表。 解決方法如下:

def __init__(self, cards=None): 
    if cards is None: 
     cards = [] 
    self.cards = cards 
    self.tricks = 0