как использовать переменную из одного класса в другом классе, не передавая класс в качестве аргумента в конструкторе - PullRequest
0 голосов
/ 03 июня 2018

Я хочу использовать self.numbers и self.suits из класса Cards в классе Deck.Единственный способ, которым я знаю, - это то, что показано ниже.Передайте class.card в качестве аргумента в методе класса Deck * __init__.Здесь проблема.Чтобы затем использовать класс Deck, я должен также передать аргумент, и мне это не нужно или не нужно делать.Надеюсь, я все хорошо объясняю.У меня та же проблема при попытке передать переменные из класса Card и Deck класса Player.

Вот код:

import random


class Card:

    def __init__(self):
        self.numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'jack', 'queen', 'king', 'ace']
        self.suits = ['hearts', 'diamonds', 'clubs', 'spades']

    # print the current card
    def __str__(self):
        print(f'{self.numbers} of {self.suits}')


class Deck(Card):
    def __init__(self, class_card):
        super().__init__()
        self.deck = []
        self.numbers = class_card.numbers
        self.suits = class_card.suits

    # create a new deck of cards
    def create_deck(self):
        for suit in self.suits:
            for number in self.numbers:
                self.deck.append([number, suit])
                return self.deck

    # shuffle the deck of cards before the start of the game
    def shuffle_deck(self, deck):
        random.shuffle(deck)

class Player(Deck):
    def __init__(self, class_deck):
        super().__init__()
        self.hand = []
        self.count_cards = 0
        self.score = 0

    # draw a card from the deck
    def draw_card(self):
        drawn_card = self.hand.append(self.deck[-1])
        return drawn_card

    # count the cards in the players hand
    def count_hand(self):
        self.count_cards = len(self.deck)
        return self.count_cards

    # calculate the score each time the player wins
    def calculate_score(self):
        pass

1 Ответ

0 голосов
/ 03 июня 2018

Когда вы запускаете super().__init__() колода унаследует атрибут чисел и мастей от карты.См. Следующее:

import random


class Card:

    def __init__(self):
        self.numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'jack', 'queen', 'king', 'ace']
        self.suits = ['hearts', 'diamonds', 'clubs', 'spades']

    # print the current card
    def __str__(self):
        print(f'{self.numbers} of {self.suits}')


class Deck(Card):
    def __init__(self):
        super().__init__()
        self.deck = []

    # create a new deck of cards
    def create_deck(self):
        for suit in self.suits:
            for number in self.numbers:
                self.deck.append([number, suit])
        return self

    # shuffle the deck of cards before the start of the game
    def shuffle_deck(self):
        random.shuffle(self.deck)

    def __len__(self):
        return len(self.deck)

    def pop(self):
        return self.deck.pop()


class People:
    def __init__(self, name):
        self.name = name


class Player(People):
    def __init__(self, name, deck):
        super().__init__(name)
        self.hand = []
        self.count_cards = 0
        self.score = 0
        self.deck = deck

    # draw a card from the deck
    def draw_card(self):
        drawn_card = self.hand.append(self.deck.pop())
        return drawn_card

    # count the cards in the players hand
    def count_hand(self):
        self.count_cards = len(self.hand)
        return self.count_cards

    # calculate the score each time the player wins
    def calculate_score(self):
        pass


def main():
    deck = Deck().create_deck()
    players = [Player(name, deck) for name in ('Jim', 'Ben', 'Paul', 'Wang')]
    deck.shuffle_deck()
    i = 0
    while len(deck):
        players[i].draw_card()
        i = (i + 1) % len(players)
    for p in players:
        print(p.name, p.count_hand(), p.calculate_score())


if __name__ == '__main__':
    main()

Вывод:

Jim 14 None
Ben 14 None
Paul 14 None
Wang 14 None

Однако мое рекомендуемое решение выглядит следующим образом:

import random


class Card:
    numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'jack', 'queen', 'king', 'ace']
    suits = ['hearts', 'diamonds', 'clubs', 'spades']

    def __init__(self, number, suit):
        self.number = number
        self.suit = suit
        self.score = self.numbers.index(number) * 10 + self.suits.index(suit)

    # print the current card
    def __str__(self):
        print(f'{self.number} of {self.suit}')

    def __eq__(self, other):
        return self.score == other.score

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


class Deck:
    def __init__(self):
        self.deck = [
            Card(num, suit) for num in Card.numbers for suit in Card.suits
        ]

    # shuffle the deck of cards before the start of the game
    def shuffle(self):
        random.shuffle(self.deck)
        return self

    def __len__(self):
        return len(self.deck)

    def pop(self):
        return self.deck.pop()


class People:
    def __init__(self, name):
        self.name = name


class Player(People):
    def __init__(self, name, deck):
        super().__init__(name)
        self.hand = []
        self.count_cards = 0
        self.score = 0
        self.deck = deck

    # draw a card from the deck
    def draw_card(self):
        drawn_card = self.hand.append(self.deck.pop())
        return drawn_card

    # count the cards in the players hand
    def count_hand(self):
        self.count_cards = len(self.hand)
        return self.count_cards

    # calculate the score each time the player wins
    def calculate_score(self):
        return sum(card.score for card in self.hand)


def main():
    deck = Deck().shuffle()
    players = [Player(name, deck) for name in ('Jim', 'Ben', 'Paul', 'Wang')]
    i = 0
    while len(deck):
        players[i].draw_card()
        i = (i + 1) % len(players)
    for p in players:
        print(p.name, p.count_hand(), p.calculate_score())


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...