首页 > 解决方案 > 我定义的实例变量和 win 变量以及 play_game 方法之间有什么区别。为什么也没有自我?

问题描述

from random import randint


class Card:
    suits = ["spades", "hearts", "diamonds", "clubs"]

    values = [None, None, "2", "3", "4", "5", "6", "7", "8",
              "9", "10", "Jack", "Queen", "King", "Ace"]

    def __init__(self, v, s):
        """suit + value are ints"""
        self.value = v
        self.suit = s

    def __gt__(self, c2):
        if self.value > c2.value:
            return True
        if self.value == c2.value:
            if self.suit > c2.suit:
                return True
            else:
                return False
        return False

    def __repr__(self):
        v = self.values[self.value] + " of " + self.suits[self.suit]
        return v


class Player:
    def __init__(self, name):
        self.wins = 0
        self.card = None
        self.name = name


class Deck:
    def __init__(self):
        self.cards = []
        for i in range(2, 15):
            for j in range(4):
                self.cards.append(Card(i, j))
        self.random_cards = []
        for x in range(len(self.cards)):
            self.x = randint(0, len(self.cards) - 1)
            self.random_cards.append(self.cards[self.x])
            self.cards.pop(self.x)

    def rm_card(self):
        if len(self.random_cards) == 0:
            return
        return self.random_cards.pop()


class Game:
    def __init__(self):

        name1 = input("p1 name ")
        name2 = input("p2 name ")
        self.deck = Deck()
        self.p1 = Player(name1)
        self.p2 = Player(name2)

    def wins(self, winner):
        w = "{} wins this round"
        w = w.format(winner)
        print(w)

    def draw(self, p1n, p1c, p2n, p2c):
        d = "{} drew {} {} drew {}"
        d = d.format(p1n, p1c, p2n, p2c)
        print(d)

    def play_game(self):
        cards = self.deck.random_cards
        print("beginning War!")
        while len(cards) >= 2:
            m = "q to quit. Any key to play:"
            response = input(m)
            if response == 'q':
                break
            p1c = self.deck.rm_card()
            p2c = self.deck.rm_card()
            p1n = self.p1.name
            p2n = self.p2.name
            self.draw(p1n, p1c, p2n, p2c)
            if p1c.__gt__(p2c):
                self.p1.wins += 1
                self.wins(p1n)
            else:
                self.p2.wins += 1
                self.wins(p2n)
        win = self.winner(self.p1, self.p2)
        if win == "It was a tie!":
            print("It was a tie!")
        else:
            print("War is over.{} wins".format(win))

    def winner(self, p1, p2):
        if p1.wins > p2.wins:
            return p1.name
        if p1.wins < p2.wins:
            return p2.name
        return "It was a tie!"


game = Game()
game.play_game()

实例变量在 init 方法中定义,因此它们可以被初始化。但是我无法在其中定义 win(游戏类,play_game 方法)变量,因为我还没有 init 方法中的所有参数。那么 win 变量和实例变量之间有什么区别,为什么我不在那里使用 self 呢?

标签: pythonclassoop

解决方案


你不使用'self'来赢得胜利的原因是因为它只需要存在于创建它的方法中,而其他变量(即在方法之外定义的东西)必须存在于多个函数中总是(init以及在您实现这些值的任何函数中)。使用 win 变量,它仅在您的 play_game() 方法中需要,因此不需要 self.


推荐阅读