我试图在Pawn类中使用ui对象,并且我在所有对象之外定义并启动ui,所以它是全局的,对吗?我在这里查看了与在类外使用变量有关的问题,但它们似乎都引用了我在启动Chess对象时在UI类中使用的.self。
#表示我为提高可读性而裁剪的代码。
class UI:
def ___init__(self):
self.chess = Chess()
# Calls main menu function which goes to a new game option
def newGame(self):
self.chess.startGame()
while len(self.chess.pieces[0] == 2): # Which is index for Kings
# Game, which is where *move* is called
class Chess:
def startGame(self):
self.chessBoard = Grid(9,9)
self.pieces = []
self.pawns = []
for i in range(8):
self.pawns.append(PawnObject(x,y,side))
self.pieces.append(self.pawns)
class Grid:
# Init method
def cellOccupied(self,x,y):
# This function checks if a place is empty
# If empty, return false else, true
class Object:
# Sets x, y, width, height
class ChessPiece:
# Child of Object sets side (black or white)
class PawnObject:
def move(self,newX,newY):
if ui.chess.chessBoard.cellOccupied(newX,newY) == False:
# Move
# More code
ui = UI()
追溯:https://gyazo.com/33e5b37b5290ff88433b29874c117ad7
我是不是做错了什么?我认为我编程的方式效率很低,因为我还在学习,所以这是结果吗?非常感谢。
问题是,这一系列级联事件都发生在UI的初始化函数内部;一个类调用下一个类,这一切都发生在原始__init__
有机会返回之前。这意味着进行初始化的行尚未完成,因此ui
变量还不存在。
你应该试着把其中的一部分从瀑布中移出来。特别是,我不明白为什么由于初始化了UI类,典当行应该移动;这似乎根本没有道理。
您还应该考虑为什么需要ui
作为全局变量;似乎更可能的是,它应该是其中一个类(也许是Grid)的属性,并且典当可以通过该实例引用它。
您可能在类的主体中使用ui
,它在解释器看到类的那一刻(因此在ui
存在之前)执行。您只能在方法或函数内部使用它,因为这些方法或函数只有在调用时才会执行。换句话说:
class UI:
def open(self):
pass
class Chess:
ui.open() # <--- this causes an error because it happens before the last line does
def startGame(self):
ui.open() # <--- this is OK
ui = UI()
此外,我认为你的消息表明你在某个地方写了global ui
,只有当你计划为ui
分配一个新值,即ui = something
时,这才是必要的。如果您只想使用它,例如ui.open()
,则不需要全局声明。但是移除它并不能解决你的问题。
您还需要更正
chessBoard = Grid(9,9)
至
self.chessBoard = Grid(9,9)
使chessBoard
成为Chess
的属性,您需要能够说出ui.chess.chessBoard
。