将类实例引用传递给Python中类定义中调用的函数
我正在尝试制作一个基本的纸牌游戏,为了跟踪轮到谁,我决定制作一个游戏类,每个实例都是一个单独的游戏。然后,当游戏实例初始化时,它还将初始化玩家对象、牌组和牌对象,并将它们绑定到该游戏对象。为此,我尝试将游戏对象“self”传递给初始化其他对象的函数,以便它们可以引用回游戏对象 这是行不通的编辑:错误为名称错误:未定义全局名称“游戏” 这个想法是完全不可能的/不道德的/有史以来最糟糕的事情,还是实现我的目标的一种完全可行的方式,但我只是在错误地实施它 整个代码都在最后,但是一个简化版本希望能够以一种不太复杂的方式说明这个场景——或者至少足够回答核心问题——如下所示:将类实例引用传递给Python中类定义中调用的函数,python,class,oop,instance,self,Python,Class,Oop,Instance,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作用域和名称空间的相关内容:以真正了解正在发生的事情。但是,如果你刚刚开始,那么这一切可能会有点混乱!没有赢家:)