为什么我不能访问在另一个类中全局定义的类的实例



我试图在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

相关内容

  • 没有找到相关文章

最新更新