将类实例引用传递给Python中类定义中调用的函数

时间:2013-09-05 15:35:01

标签: python class oop instance self

我正在尝试制作一个基本的纸牌游戏,为了跟踪轮到谁,我决定制作一个游戏类,每个实例都是一个单独的游戏。然后,当游戏实例初始化时,它还会初始化玩家对象和牌组和牌对象,并将它们绑定到该游戏对象。为此,我尝试将游戏对象'self'传递给初始化其他对象的函数,以便它们可以引用回游戏对象。

这没效果。 编辑:错误是NameError:全局名称'游戏'未定义

这个想法是完全不可能/不道德/最糟糕的事情,还是完全可行的实现目标的方法,但我只是错误地实施它?

整个代码都在最后,但是一个简化的版本,希望能够以一种不那么复杂的方式说明这个场景 - 或至少足以回答核心问题 -

from collections import deque
from random import shuffle

DECK = {"value_range": (1, 6),
    "black_multiple": 2,
    "red_multiple": 2,
    "dead": 12}

class Game:
    """A game instance."""
    def __init__(self, deck=DECK):
        self.deck = Deck(self, **deck)
        self.deck.shuffle()   

class Deck:
    def __init__(self, game, value_range, black_multiple, red_multiple, dead):
        self.deck = deque()
        for value in range(*value_range):
            for i in range(black_multiple):
                self.deck.append(Card(game, value, "Black"))
            for i in range(red_multiple):
                self.deck.append(Card(game, value, "Red"))
        for i in range(dead):
            self.deck.append(Card(game))
    def shuffle(self):
        shuffle(self.deck)
    def draw(self):
        return self.deck.popleft()

这是完整的(未完成的)代码,如果这还不够信息:

from collections import deque
from random import shuffle

DECK = {"value_range": (1, 6),
        "black_multiple": 2,
        "red_multiple": 2,
        "dead": 12}

class Game:
    """A game instance."""
    def __init__(self, player_names=["Simon", "Will"], start_cards=2,
                 deck=DECK):
        self.deck = Deck(self, **deck)
        self.deck.shuffle()
        self.players = deque()
        for name in player_names:
            self.players.append(Player(self, name))
        for player in self.players:
            player.draw(start_cards)
    def lose(self, player):
#        print(player.name + "loses.")
        pass
    def new_turn(self):
        self.players.rotate(-1)
    def get_active(self):
        return self.players[0]
    def get_passive(self):
        return list(self.players)[1:]

class Card:
    """A card instance.

    Black cards get an extra method! Dead cards have value and colour False."""
    def __init__(self, game, value=False, colour=False):
        self.value = value
        self.colour = colour
        def get_value(self):
            return self.value
        def get_colour(self):
            return self.colour
        if self.colour == "Black":
            def action(self, target):
                active = game.get_active()
                responders = game.get_passive()
                for responder in responders:
                    if responder.respond(self.value) == False:
                        continue
                    else:
                        if target == active:
                            target = responder
                        else:
                            target = active
                        break
                target.draw(self.value)

class Player:
    def __init__(self, game, name):
        self.name = name
        self.hand = {}
    def draw(self, value):
        for i in range(value):
            try:
                draw_card = game.deck.draw()
            except IndexError:
                game.lose(self)
                break
            else:
                self.hand.append(draw_card)
                continue
    def get_hand(self):
        return self.hand

class Deck:
    def __init__(self, game, value_range, black_multiple, red_multiple, dead):
        self.deck = deque()
        for value in range(*value_range):
            for i in range(black_multiple):
                self.deck.append(Card(game, value, "Black"))
            for i in range(red_multiple):
                self.deck.append(Card(game, value, "Red"))
        for i in range(dead):
            self.deck.append(Card(game))
    def shuffle(self):
        shuffle(self.deck)
    def draw(self):
        return self.deck.popleft()

感谢您花时间阅读本文!我之前没有做过很多正式的编码培训/练习,所以我试图通过试错法/ PyDocs来学习Python。

1 个答案:

答案 0 :(得分:2)

你在做什么应该没事。在__init__Deck的{​​{1}}方法中,您应该将引用存储到Player

game

你现在没有这样做,所以我看不出你以后如何引用游戏。

例如,在玩家的def __init__(self, game, *args): self.game = game 方法中,您执行draw。在game.lose()方法中将其分配给self后,需要self.game.lose()