gpt4 book ai didi

Python repr 和将类实例作为参数传递

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:01 24 4
gpt4 key购买 nike

所以我有一门类(class),我设置了类似的内容

class Piece: 
def __init__():
self.txt = "\u2665"

# some methods...
# including a method validMovements(), which works properly, no errors here

def __repr__():
return self.txt

现在我继续执行以下代码

class GameManagement: 
# various methods, no errors here

def calculatePossibleMoves() # this is called at the end of each turn, for the next turn, this is also calculated in the initialization function of the GameManagement class, the problem is not here
self.possibleMoves = {}
for piece in self.piecesDict: # contains all pieces
self.possibleMoves[piece] = piece.validMovements()

然后,在另一个类中,我使用这个变量

# note that self.selection contains an instance of the Piece class object
# and self.game contaisn a GameManaement class object
l = self.game.possibleMoves[self.selection]
# i get my error here, it seems liek in the GameManagement class, the dict uses the calss instance as key, however her it uses __repr__ as the key, instead of the object

有办法解决这个问题吗(阅读评论中的详细信息)?

回溯如下:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
return self.func(*args)
File "C:\Users\Saume\Workspace\ChessUI\src\ui\gameboard.py", line 189, in select
self.move(event) # call move
File "C:\Users\Saume\Workspace\ChessUI\src\ui\gameboard.py", line 205, in move
self.draw()
File "C:\Users\Saume\Workspace\ChessUI\src\ui\gameboard.py", line 142, in draw
self.createcanvas()
File "C:\Users\Saume\Workspace\ChessUI\src\ui\gameboard.py", line 120, in createcanvas
l = self.game.aJouer[self.selection]
KeyError: ♙

请注意,回溯中的一些代码是法语的,但它与我放置在那里的方式完全一致。

def select(self, event):
"""Selectionne une piece"""
if self.selection == None: # il n'y a pas de selection
try:
# coordonnees
x = event.x // self.size
y = event.y // self.size
# piece
p = self.game.board.getPiece(y, x)
if p != None:
if p.color == (self.game.time + 1) % 2: # piece de couleur alliee au joueur actuel
self.selection = p
else: # piece ennemie
raise err.InvalidSelection("La piece selectionnee n'est pas de votre couleur.")
else:
raise err.EmptySelection("Il n'y a aucune piece sur la case selectionnee.")

except err.InvalidSelection as e:
self.errorLabel.config(text=e) # afficher le message d'erreur
except err.EmptySelection as e:
self.errorLabel.config(text=e) # afficher le message d'erreur
else: # il y a deja une piece selectionnee
self.move(event) # call move
self.draw()

最佳答案

错误非常明显 - self.game.aJouer 不包含 self.selection 中的片段作为关键。

请注意,您没有显示任何保证这一点的代码。事实上,您根本没有显示任何显示 aJouer 的代码。

__repr__ 结果用作 key 。您被错误消息误导了。当python想要显示一个实例时(例如,当它报告错误时),它会调用__repr__。这就是那里发生的一切。 __repr__ 和实际实例之间没有混淆。

事实上,用作键的是 __hash__ 返回的值(它与 dict 中的哈希算法中的 __equals__ 一起工作) >)。但如果您没有替换它,那么默认版本应该可以正常工作。

关于Python repr 和将类实例作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com