2017-02-22 5 views
0

Я пытаюсь создать массив (колоду) объектов (карт). Для этого я использую метод Card.construct() для объекта Deck.card в методе Deck.construct(). Я могу успешно создать массив (Deck.cards) карточных объектов, проблема в том, что это Aces of Spades, 52 из них. Это где массив будет создаваться:Любопытный случай Ace of Spades (создание массива объектов в python3)

def construct(self): 
     for value in self.card.values: 
      for suit in self.card.suits: 
       self.card.construct(value, suit) 
       self.card.showNice() 
       self.cards.append(self.card) 

Различные виды карт печатаются правильно перед заданием, но по какой-то причине, только кажется, что туз пик, который будет добавлен в массив. Я действительно не понимаю, почему это происходит.

import random 

class Card: 
    def __init__(self): 
     self.value = '' 
     self.values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] 
     self.suit = '' 
     self.suits = ['♥', '♦', '♣', '♠'] 
     self.valit = (self.value, self.suit) 

    def construct(self, value, suit): 
     self.value = value 
     self.suit = suit 
     self.valit = (value, suit) 

    def random(self): 
     self.valit = (random.choice(self.values), random.choice(self.suits)) 

    def show(self): 
     print(self.valit, end='') 

    def showNice(self): 
     print(self.value, self.suit, ' ', sep='', end='') 

class Deck: 
    def __init__(self): 
     self.card = Card() 
     self.cards = [] 

    def construct(self): 
     for value in self.card.values: 
      for suit in self.card.suits: 
       self.card.construct(value, suit) 
       self.cards.append(self.card) 

    def shuffleUp(self): 
     random.shuffle(self.cards) 

    def show(self): 
     for card in self.cards: 
      card.show() 
     print('\n') 

    def showNice(self): 
     for card in self.cards: 
      card.showNice() 
     print('\n') 

...

#!/usr/bin/python 
from environment.environment import * 

class shuffleUpAndDeal(): 
    deck = Deck() 
    deck.construct() 
    deck.shuffleUp() 
    deck.showNice() 

if __name__ == '__main__': 
    shuffleUpAndDeal() 

Я новичок в целом идея объекты, классы, методы и т.д., так, скорее всего, я не оптимизации кода правильным образом, любые предложения много оценили. Заранее спасибо!

+0

Вы почти наверняка избавитесь от полей 'value',' suite' и 'valit' класса. Не храните произвольную информацию в качестве переменных экземпляра. Верните карточку из 'construct', затем добавьте возвращенную карточку в' cards'. Когда это возможно, передавайте информацию в явном виде на функции и возвращайте информацию из них; не полагайтесь на фоновое состояние объекта. Это, вероятно, не ваша проблема, но ваш код очень запутанно читать. Фиксация, которая может прояснить ситуацию. – Carcigenicate

+0

Вы создаете ТОЧНО один объект '' Card'' в своей программе в '' Deck .__ init __() ''. Затем вы последовательно устанавливаете одну карту для каждой комбинации значений и костюма последовательно. – jasonharper

+0

Carcigenicate point, jasonharper извините меня за то, что я не получил правильную терминологию – soocki

ответ

0

Проблема в том, что вы повторно используете один и тот же экземпляр Card снова и снова и меняете его после того, как он уже добавлен в список. Вы добавили ссылки на одну и ту же карту в список 52 раза и сменили одну и ту же карточку 52 раза. Вот почему он заканчивается в последней комбинации.

ПримечаниеЭтот часть:

def construct(self): 
    for value in self.card.values: 
     for suit in self.card.suits: 
      self.card.construct(value, suit) 
      self.cards.append(self.card) 

    print(self.cards) # I added this line 

Это то, что print печатает:

[<__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>] 

Смотрите 0x0377DB10 немного? Это адрес объекта. Обратите внимание, как они все одинаковы! Каждый раз, когда вы вызываете self.card.construct(value, suit), вы просто меняете этот единственный экземпляр, включая все ссылки на него, которые уже находятся в self.cards.

Если вы запускали тест, затем изменил deck.card.suit, затем снова запускали тест, вы бы увидели, что все карты были одновременно изменены.

Создайте новую карту каждый раз, чтобы вы не переписывали один и тот же экземпляр.

Вот модифицированная версия, которая работает. Обратите внимание, как я создаю новую карту каждый раз, когда:

def construct(self): 
    for value in self.card.values: 
     for suit in self.card.suits: 
      card = Card() 
      card.construct(value, suit) 

      self.cards.append(card) 

    print(self.cards) 

Это то, что новая версия печатает:

[<__main__.Card object at 0x0376DB90>, <__main__.Card object at 0x0376DBB0>, <__main__.Card object at 0x0376DBD0>, <__main__.Card object at 0x0376DBF0>, <__main__.Card object at 0x0376DC10>, <__main__.Card object at 0x0376DC30>, <__main__.Card object at 0x0376DC50>, <__main__.Card object at 0x0376DC70>, <__main__.Card object at 0x0376DC90>, <__main__.Card object at 0x0376DCB0>, <__main__.Card object at 0x0376DCD0>, <__main__.Card object at 0x0376DCF0>, <__main__.Card object at 0x0376DD10>, <__main__.Card object at 0x0376DD30>, <__main__.Card object at 0x0376DD50>, <__main__.Card object at 0x0376DD70>, <__main__.Card object at 0x0376DD90>, <__main__.Card object at 0x0376DDB0>, <__main__.Card object at 0x0376DDD0>, <__main__.Card object at 0x0376DDF0>, <__main__.Card object at 0x0376DE10>, <__main__.Card object at 0x0376DE30>, <__main__.Card object at 0x0376DE50>, <__main__.Card object at 0x0376DE70>, <__main__.Card object at 0x0376DE90>, <__main__.Card object at 0x0376DEB0>, <__main__.Card object at 0x0376DED0>, <__main__.Card object at 0x0376DEF0>, <__main__.Card object at 0x0376DF10>, <__main__.Card object at 0x0376DF30>, <__main__.Card object at 0x0376DF50>, <__main__.Card object at 0x0376DF70>, <__main__.Card object at 0x0376DF90>, <__main__.Card object at 0x0376DFB0>, <__main__.Card object at 0x0376DFD0>, <__main__.Card object at 0x0376DFF0>, <__main__.Card object at 0x03775030>, <__main__.Card object at 0x03775050>, <__main__.Card object at 0x03775070>, <__main__.Card object at 0x03775090>, <__main__.Card object at 0x037750B0>, <__main__.Card object at 0x037750D0>, <__main__.Card object at 0x037750F0>, <__main__.Card object at 0x03775110>, <__main__.Card object at 0x03775130>, <__main__.Card object at 0x03775150>, <__main__.Card object at 0x03775170>, <__main__.Card object at 0x03775190>, <__main__.Card object at 0x037751B0>, <__main__.Card object at 0x037751D0>, <__main__.Card object at 0x037751F0>, <__main__.Card object at 0x03775210>] 

Обратите внимание, как все адреса разные! Сейчас все разные карты.

Когда я запустить тест, я получаю:

2♥ K♥ 3♥ J♥ 6♥ 5♣ 7♣ 7♦ 8♣ 5♦ 3♣ Q♥ 10♣ 9♣ 9♥ A♦ 8♥ 9♠ 6♠ A♠ K♣ K♠ J♦ 2♦ 7♥ 10♠ 6♦ 6♣ 4♠ 5♠ K♦ 3♦ 4♥ 9♦ Q♠ 7♠ A♣ 4♣ 10♦ A♥ Q♦ 4♦ 5♥ J♣ 8♠ 3♠ J♠ Q♣ 8♦ 10♥ 2♣ 2♠ 

Я хотел бы отметить, однако, что метод construct ненужно. Он выполняет работу, которую должен выполнять конструктор Card, но гораздо менее интуитивно понятным способом. Точка конструктора - construct. Подумайте о состоянии карты, если вы забыли позвонить construct.Нельзя забывать, если вы просто используете конструктор.

+0

ну, я буду проклят. Большое спасибо за усилия, предпринятые для этого. Теперь, когда вы объяснили это, это имеет такой смысл. Спасибо за обширное объяснение тоже, очень ценится. Я буду работать над конструктором, и, как вы предложили, я поместил все соответствующие биты в раздел __init__, где он принадлежит. Тот факт, что конструкторы конструкторов также имеет большой смысл! Береги себя! – soocki

Смежные вопросы