ООП Колода карт в Python

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

Я могу получить базовое поведение через функции, и я понятия не имею, как превратить его в класс. Я впервые придумал это:

class Deck:

    def shuffle():
        cards = []
        suits = ['H', 'D', 'S', 'C']
        for suit in suits:
            for i in range(1, 14):
                cards.append((i, suit))
        shuf_deck = random.sample(cards, len(cards))
        return shuf_deck 

Вышеупомянутое работает, но это просто не очень хорошо. Во-первых, это просто функция, которая делает две вещи: создает колоду и тасует ее; кажется, они должны быть различны. Похоже, создание колоды для начала — хорошая работа для функции __init__. Основываясь на другом вопросе, я собрал это вместе:

class Deck:
    def __init__(self):
        self.suits = ['Hearts', 'Diamonds,' 'Spades', 'Clubs']
        self.values = range(1, 14)
        self.cards = []
        for Card in itertools.product(self.suits, self.values):
            self.cards.append(Card)

    def shuffle():
        # Not quite sure what to do here yet
        return self.cards

deck = Deck()
print(deck) 

Но это не работает. Код внутри функции __init__ успешно создает колоду, но я не могу ее "объективировать". Я пробовал это несколькими разными способами, и он либо возвращает что-то вроде <__main__.Deck object at 0x7f56969f5630>, что, как я полагаю, является адресом памяти самого объекта, либо я получаю какую-то ошибку, недопустимый синтаксис, ошибку атрибута и т. д. Я не могу показаться получить данные от __init__; когда я пытаюсь вернуть данные непосредственно из __init__, я получаю сообщение об ошибке, и всякий раз, когда я пытаюсь получить эти данные из другого метода в классе, я также получаю ошибки. Может ли кто-нибудь сказать мне, что мне не хватает?


person John Aten    schedule 19.08.2018    source источник
comment
Вот ответ, который я разместил на какой-то другой вопрос, вы можете помочь себе в этом: stackoverflow.com/a/50770568/5079316   -  person Olivier Melançon    schedule 20.08.2018
comment
Что вы имеете в виду под я не могу полностью «объективировать»? <__main__.Deck object at 0x7f56969f5630> — это представление вашего объекта Deck. Теперь вопрос в том, что вы хотите сделать с объектом колоды. Вы можете реализовать метод для его перемешивания и один для повторения его карт и т. д.   -  person zvone    schedule 20.08.2018
comment
Что я имею в виду под «объективным», так это то, что, хотя я концептуально понимаю, что результатом должно быть что-то похожее на Deck API @OlivierMelançon, я даже отдаленно не могу заставить работать даже плохую версию. Я просто получаю функцию или ряд функций, которые оказались в объявлении класса, а не реальную «объективированную» модель объекта; Я не уверен, как сказать это более точно.   -  person John Aten    schedule 20.08.2018
comment
@OlivierMelançon то, что у вас здесь происходит, - это именно то, что я собирался сделать, но не смог понять, как это сделать. Спасибо за такой подробный ответ; это также, кажется, отвечает на следующую дюжину или около того вопросов, которые у меня наверняка возникнут.   -  person John Aten    schedule 20.08.2018


Ответы (1)


deck — это фактический объект Deck. print(deck) даст вам адрес памяти объекта.

Под «получением данных от __init__» я полагаю, что вы заинтересованы в получении атрибутов:

deck.suits # this will give you ['Hearts', 'Diamonds,' 'Spades', 'Clubs']
deck.values # this will be [1,2, ..13]

и так далее.

person jh314    schedule 19.08.2018
comment
Спасибо что подметил это! - person jh314; 20.08.2018
comment
Круто, это ответ на мой вопрос о init. Под получением данных я подразумеваю просто возможность что-то делать с ними в методах и возвращаемых значениях. Благодарю вас! - person John Aten; 20.08.2018