2013-10-05 2 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 

Вы видите, в определении функции в Python, как def __init__(self, cards=[]): параметры по умолчанию вычисляются только один раз, когда определение функции загружается интерпретатором, так что они ведут себя своего рода глобальный-иш , Также обратите внимание, что список является изменяемым объектом, поэтому по определению он может изменять его элементы. В результате, когда вы вызываете self.cards.append(card), он присоединяется к этому однажды оцениваемому, каждый раз в том же списке. Решение:

def __init__(self, cards=None): 
    if cards is None: 
     cards = [] 
    self.cards = cards 
    self.tricks = 0 
Смежные вопросы