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

将类实例引用传递给Python中类定义中调用的函数,python,class,oop,instance,self,Python,Class,Oop,Instance,Self,我正在尝试制作一个基本的纸牌游戏,为了跟踪轮到谁,我决定制作一个游戏类,每个实例都是一个单独的游戏。然后,当游戏实例初始化时,它还将初始化玩家对象、牌组和牌对象,并将它们绑定到该游戏对象。为此,我尝试将游戏对象“self”传递给初始化其他对象的函数,以便它们可以引用回游戏对象 这是行不通的编辑:错误为名称错误:未定义全局名称“游戏” 这个想法是完全不可能的/不道德的/有史以来最糟糕的事情,还是实现我的目标的一种完全可行的方式,但我只是在错误地实施它 整个代码都在最后,但是一个简化版本希望能够以一

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

这是行不通的编辑:错误为名称错误:未定义全局名称“游戏”

这个想法是完全不可能的/不道德的/有史以来最糟糕的事情,还是实现我的目标的一种完全可行的方式,但我只是在错误地实施它

整个代码都在最后,但是一个简化版本希望能够以一种不太复杂的方式说明这个场景——或者至少足够回答核心问题——如下所示:

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。

您所做的应该没问题。在
牌组
玩家
初始化
方法中,您应该存储对
游戏的引用

def __init__(self, game, *args):
    self.game = game
你现在没有这么做,所以我不知道你以后会怎么引用这个游戏


例如,在玩家的
draw
方法中,您可以执行
game.lose()
。在
\uuuu init\uuuu
方法中将其分配给self之后,它需要是
self.game.lose()

“这没用”——你能说得更具体一点吗?你从你的程序中看到了什么行为?你期望什么行为?另一件有时有用的事情是尝试将其归结为一个非常小的测试程序,您认为该程序应该以某种方式运行,并验证您的语言思维模型是否正确。此外,在方法、函数和类之间使用换行符。啊,谢谢!这是有道理的,我应该想到这一点。在清除了一些只有一次被纠正(试图附加到一个集合中)后,它现在可以完美地工作了。我花了一天的大部分时间试图让这件事成功,现在我感到非常欣慰。这只是一个简单的误解,当你开始工作的时候。您可能需要阅读Python作用域和名称空间的相关内容:以真正了解正在发生的事情。但是,如果你刚刚开始,那么这一切可能会有点混乱!没有赢家:)